【Android】fragment+Viewpager+自動非表示ナビゲーションバー
17127 ワード
1、まず自動fragment+Viewpagerを紹介する
これは効果図です.
次のステップに分けられます.
1、カスタムfragmentPagerAdapter、これはViewpagerがfragmentに適したアダプタである
2、4つのfragmentの作成を完成する
3、activityの完了main.xml
4、MainActivityにViewpagerとそのリスナーをセットすればいい
1.1カスタムfragmentPage人Adapter——MainFragmentPagerAdapter
ここで構築方法とgetItemとgetCountは、アダプタをカスタマイズする際に実現しなければならない方法です.ここではlistが4つのfragmentを操作するのに便利だと伝えました.
1.2 4つのfragmentの作成を完了します.
ここでは簡単に1つだけ挙げて、他の3つはこれとあまり差がありません.onCreateViewメソッドを簡単に実装するだけで
ここのinflateパラメータの最後は必ずfalseでなければなりません.そうしないと、レイアウトエラー(複数の親コンポーネント)でエラーが発生します.
1.3、完了activity_mian.xmlの書き込み:
在这里我们处于对重复调用次数较多的代码style独立出来写了一个公共style
ボタンクリック効果の選択でselectorを作成しました
注意、ここはRadioButtonとButtonの違いです
RadioButtonでは、そのcheckedの効果が表示されます.つまり、上のselectorの3番目のitemが有効です.RadioButtonは選択された状態を維持できるからです.
しかし、Buttonを使用すると、selectorの3番目のitemが無効になり、リスナーで背景画像を手動で交換することでしか実現できません.
1.4、MainActivity.JAvaの構成
1.4.1初期化
1.4.2 adapterとインタフェースの変更を設定するリスナー
2、下部ナビゲーションバーの自動非表示を実現する方法
実装効果:画面が一定時間以内にイベントに応答しないと、下部のナビゲーションバーが自動的に非表示になり、クリックイベントが発生すると、ナビゲーションバーが自動的に浮かび上がる
核心思想はtranslateAnimation+onTouchEventの傍受である
注意すべき点は2つあります.
一、Googleはtimerを使用してタイミング機能を実現することを提案していません.これは低効率で安全ではありません.
二、Viewpagerはクリックイベントを優先的に使用します.クリックイベントを再割り当てしなければなりません.そうしないと、onTouchEventは無効です.
最初にHandlerを使いますpostDelayed();解決する
このように使用する場合、私たちは通常Runnableをカスタマイズします.
そして適当な場所で呼び出せばいいです.
2つ目の注意点は、次のように処理できます.
onTOuchEventのリスニングは、次のように実現できます.
では全体的にJAvaファイルのコードは次のとおりです.
これは効果図です.
次のステップに分けられます.
1、カスタムfragmentPagerAdapter、これはViewpagerがfragmentに適したアダプタである
2、4つのfragmentの作成を完成する
3、activityの完了main.xml
4、MainActivityにViewpagerとそのリスナーをセットすればいい
1.1カスタムfragmentPage人Adapter——MainFragmentPagerAdapter
package com.ing.adapters;
import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* @date 2015-3-10
* @author DLX
* FragmentPagerAdapter, Viewpager
*/
public class MainFragmentPagerAdapter extends FragmentPagerAdapter {
private ArrayList fragmentList;
public MainFragmentPagerAdapter(FragmentManager fm,ArrayList fragmentList) {
super(fm);
this.fragmentList = fragmentList;
}
@Override
public Fragment getItem(int i) {
return fragmentList.get(i);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
ここで構築方法とgetItemとgetCountは、アダプタをカスタマイズする際に実現しなければならない方法です.ここではlistが4つのfragmentを操作するのに便利だと伝えました.
1.2 4つのfragmentの作成を完了します.
ここでは簡単に1つだけ挙げて、他の3つはこれとあまり差がありません.onCreateViewメソッドを簡単に実装するだけで
package com.ing.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.carpool.R;
public class MessageFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_message, container,false);
}
}
ここのinflateパラメータの最後は必ずfalseでなければなりません.そうしないと、レイアウトエラー(複数の親コンポーネント)でエラーが発生します.
1.3、完了activity_mian.xmlの書き込み:
在这里我们处于对重复调用次数较多的代码style独立出来写了一个公共style
ボタンクリック効果の選択でselectorを作成しました
-
-
-
注意、ここはRadioButtonとButtonの違いです
RadioButtonでは、そのcheckedの効果が表示されます.つまり、上のselectorの3番目のitemが有効です.RadioButtonは選択された状態を維持できるからです.
しかし、Buttonを使用すると、selectorの3番目のitemが無効になり、リスナーで背景画像を手動で交換することでしか実現できません.
1.4、MainActivity.JAvaの構成
1.4.1初期化
package com.ing.activities;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
import com.example.carpool.R;
import com.ing.adapters.MainFragmentPagerAdapter;
import com.ing.fragments.CarpoolGroupFragment;
import com.ing.fragments.MessageFragment;
import com.ing.fragments.MineFragment;
import com.ing.fragments.SeekFragment;
public class MainActivity extends FragmentActivity{
// 4
private Button btn_seek, btn_carpoolgroup, btn_message, btn_mine;
private LinearLayout ll;
// Viewpager
private ViewPager viewPager;
// Viewpager 4 fragment list
private ArrayList fragmentList = new ArrayList();
// Viewpager fragment
private MainFragmentPagerAdapter fragmentPagerAdapter;
// waitDuration
private int waitDuration = 5000;
//
private int animDistance = 120;
//
private boolean weatherHide=false;
// Handler
private Handler hideHandler = new Handler();
// Runnable
private HideRunnable hideRunnable = new HideRunnable();
// Runnable
private boolean hasRunnable=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setViewPager();
}
/**
*
*/
private void init() {
// Handler
hideHandler.postDelayed(hideRunnable, waitDuration);
hasRunnable=true;
// Viewpager
viewPager = (ViewPager) findViewById(R.id.viewpager);
//
ll = (LinearLayout) findViewById(R.id.ll);
btn_seek = (Button) findViewById(R.id.btn_seek);
btn_carpoolgroup = (Button) findViewById(R.id.btn_carpoolgrooup);
btn_message = (Button) findViewById(R.id.btn_message);
btn_mine = (Button) findViewById(R.id.btn_mine);
// 4
btn_seek.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(0);
}
});
btn_carpoolgroup.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(1);
}
});
btn_message.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(2);
}
});
btn_mine.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(3);
}
});
// fragment
SeekFragment seekFragment = new SeekFragment();
CarpoolGroupFragment carpoolGroupFragment = new CarpoolGroupFragment();
MessageFragment messageFragment = new MessageFragment();
MineFragment mineFragment = new MineFragment();
fragmentList.add(seekFragment);
fragmentList.add(carpoolGroupFragment);
fragmentList.add(messageFragment);
fragmentList.add(mineFragment);
fragmentPagerAdapter = new MainFragmentPagerAdapter(
getSupportFragmentManager(), fragmentList);
}
1.4.2 adapterとインタフェースの変更を設定するリスナー
/**
* Viewpager
*/
private void setViewPager() {
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
btn_seek.performClick();
break;
case 1:
btn_carpoolgroup.performClick();
break;
case 2:
btn_message.performClick();
break;
case 3:
btn_mine.performClick();
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
2、下部ナビゲーションバーの自動非表示を実現する方法
実装効果:画面が一定時間以内にイベントに応答しないと、下部のナビゲーションバーが自動的に非表示になり、クリックイベントが発生すると、ナビゲーションバーが自動的に浮かび上がる
核心思想はtranslateAnimation+onTouchEventの傍受である
注意すべき点は2つあります.
一、Googleはtimerを使用してタイミング機能を実現することを提案していません.これは低効率で安全ではありません.
二、Viewpagerはクリックイベントを優先的に使用します.クリックイベントを再割り当てしなければなりません.そうしないと、onTouchEventは無効です.
最初にHandlerを使いますpostDelayed();解決する
このように使用する場合、私たちは通常Runnableをカスタマイズします.
/**
* @date 2015-3-11
* @author DLX
* handler Runnable
*/
class HideRunnable implements Runnable{
@Override
public void run() {
hideHandler.removeCallbacks(hideRunnable);
weatherHide=true;
//
final Animation anim = new TranslateAnimation(0,0,0,animDistance);
anim.setDuration(400);
anim.setFillAfter(true);
anim.setInterpolator(new LinearInterpolator());
ll.setAnimation(anim);
ll.setVisibility(View.GONE);
anim.startNow();
}
}
そして適当な場所で呼び出せばいいです.
2つ目の注意点は、次のように処理できます.
/**
* Viewpager , onTouchEvent
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// onTouchEvent
this.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
onTOuchEventのリスニングは、次のように実現できます.
/**
*
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
// , , ( Handler )
if (weatherHide) {
final Animation animUp = new TranslateAnimation(0,0,animDistance,0);
animUp.setDuration(400);
animUp.setFillAfter(true);
ll.setAnimation(animUp);
animUp.startNow();
ll.setVisibility(View.VISIBLE);
weatherHide=false;
hideHandler.postDelayed(hideRunnable, waitDuration);
}else {
// , ( )
if (hasRunnable) {
hideHandler.removeCallbacks(hideRunnable);
hideHandler.postDelayed(hideRunnable, waitDuration);
}
}
}
return false;
}
では全体的にJAvaファイルのコードは次のとおりです.
package com.ing.activities;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
import com.example.carpool.R;
import com.ing.adapters.MainFragmentPagerAdapter;
import com.ing.fragments.CarpoolGroupFragment;
import com.ing.fragments.MessageFragment;
import com.ing.fragments.MineFragment;
import com.ing.fragments.SeekFragment;
public class MainActivity extends FragmentActivity{
// 4
private Button btn_seek, btn_carpoolgroup, btn_message, btn_mine;
private LinearLayout ll;
// Viewpager
private ViewPager viewPager;
// Viewpager 4 fragment list
private ArrayList fragmentList = new ArrayList();
// Viewpager fragment
private MainFragmentPagerAdapter fragmentPagerAdapter;
// waitDuration
private int waitDuration = 5000;
//
private int animDistance = 120;
//
private boolean weatherHide=false;
// Handler
private Handler hideHandler = new Handler();
// Runnable
private HideRunnable hideRunnable = new HideRunnable();
// Runnable
private boolean hasRunnable=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setViewPager();
}
/**
* Viewpager , onTouchEvent
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// onTouchEvent
this.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
/**
*
*/
private void init() {
// Handler
hideHandler.postDelayed(hideRunnable, waitDuration);
hasRunnable=true;
// Viewpager
viewPager = (ViewPager) findViewById(R.id.viewpager);
//
ll = (LinearLayout) findViewById(R.id.ll);
btn_seek = (Button) findViewById(R.id.btn_seek);
btn_carpoolgroup = (Button) findViewById(R.id.btn_carpoolgrooup);
btn_message = (Button) findViewById(R.id.btn_message);
btn_mine = (Button) findViewById(R.id.btn_mine);
// 4
btn_seek.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(0);
}
});
btn_carpoolgroup.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(1);
}
});
btn_message.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(2);
}
});
btn_mine.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewPager.setCurrentItem(3);
}
});
// fragment
SeekFragment seekFragment = new SeekFragment();
CarpoolGroupFragment carpoolGroupFragment = new CarpoolGroupFragment();
MessageFragment messageFragment = new MessageFragment();
MineFragment mineFragment = new MineFragment();
fragmentList.add(seekFragment);
fragmentList.add(carpoolGroupFragment);
fragmentList.add(messageFragment);
fragmentList.add(mineFragment);
fragmentPagerAdapter = new MainFragmentPagerAdapter(
getSupportFragmentManager(), fragmentList);
}
/**
* Viewpager
*/
private void setViewPager() {
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
btn_seek.performClick();
break;
case 1:
btn_carpoolgroup.performClick();
break;
case 2:
btn_message.performClick();
break;
case 3:
btn_mine.performClick();
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
/**
*
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
// , , ( Handler )
if (weatherHide) {
final Animation animUp = new TranslateAnimation(0,0,animDistance,0);
animUp.setDuration(400);
animUp.setFillAfter(true);
ll.setAnimation(animUp);
animUp.startNow();
ll.setVisibility(View.VISIBLE);
weatherHide=false;
hideHandler.postDelayed(hideRunnable, waitDuration);
}else {
// , ( )
if (hasRunnable) {
hideHandler.removeCallbacks(hideRunnable);
hideHandler.postDelayed(hideRunnable, waitDuration);
}
}
}
return false;
}
/**
* @date 2015-3-11
* @author DLX
* handler Runnable
*/
class HideRunnable implements Runnable{
@Override
public void run() {
hideHandler.removeCallbacks(hideRunnable);
weatherHide=true;
//
final Animation anim = new TranslateAnimation(0,0,0,animDistance);
anim.setDuration(400);
anim.setFillAfter(true);
anim.setInterpolator(new LinearInterpolator());
ll.setAnimation(anim);
ll.setVisibility(View.GONE);
anim.startNow();
}
}
}