【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
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();
		}
	}
}