Android Fragment 切換時佈局重疊/開發滑動廣告Banner

一.用Fragment模擬Tab頁面,有時會發生切換時佈局重疊問題,具體是當應用在後臺運行時,設置更改語言選項或系統不小心強制關閉後,再進入應用會同時顯示多個Tab內容,UI界面文字發生重疊。

這是因爲再次回到這個app的時候,通過onCreate中的參數savedInstanceState恢復了之前的fragment。此時的FragmentTransaction中的相當於又再次add了fragment進去的,之前保存的fragment也還在。hide()和show()方法對之前保存的fragment已經失效了。所以出現了重疊的現象。

解決方法1:

各個對應的Fragment xml文件設置不透明的背景顏色,掩蓋掉其它fragment:android:background="@color/white"

解決方法2:

 

@Override

public void onSaveInstanceState(Bundle outState) {  

 //super.onSaveInstanceState(outState);//將這一行註釋掉,阻止activity保存fragment的狀態

}

解決方法3:

Fragment frag[]={new GameFragment(),new LiveFragment(),new DataFragment(),new PersonalFragment()};

FragmentManager fm = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mian);
if(savedInstanceState!=null){
//tag爲add時的tag
for(int i=0;i<frag.length;i++){
Fragment fragtag = fm.findFragmentByTag("tag"+i);
if (fragtag!=null) {
frag[i]=fragtag;
}
}
}
}

二.viewpager fragment開發滑動的廣告banner:

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.app.ActionBar;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 側滑BannerUtils (activity4fragment/fragment4fragment)
 */
public class BannerUtils {
	private FragmentActivity mContext;
	private FragmentManager mfmanager;
	private ViewPager mvp;
	private LinearLayout mindicator;
	private int mselectedId;
	private int munSelectedId;
	private int mtype;//0自動循環廣告圖片;1手動循環相同排版頁;2手動切換不同Fragment
	private ArrayList<String> mlistIndicator;
	private ArrayList mlist;
	private Timer mtimer = new Timer();
	private boolean isStop;
	private int totalNum;
	private int currentNum;

	/**手動側滑BannerUtils
	 * @param context Fragment/Activity
	 * @param viewpager ViewPager佈局
	 * @param indicator LinearLayout指示器圖標佈局
	 * @param selectedId   選中時顏色
	 * @param unSelectedId 未選中顏色
	 * @param listIndicator 對應標題容器
	 * @param listDate 內容數據容器Fragment
	 */
	public void initBanner4fragment(Object context, ViewPager viewpager, LinearLayout indicator, int selectedId, int unSelectedId
			, ArrayList<String> listIndicator, ArrayList<Fragment> listDate){
		if (context instanceof Fragment){
			Fragment contextf = (Fragment) context;
			mContext=contextf.getActivity();
			mfmanager=contextf.getChildFragmentManager();
		}else{
			FragmentActivity fa=(FragmentActivity) context;
			mContext=fa;
			mfmanager=fa.getSupportFragmentManager();
		}
		mvp=viewpager;
		mindicator=indicator;
		mselectedId=selectedId;
		munSelectedId=unSelectedId;
		mlistIndicator=listIndicator;
		mlist=listDate;
		mtype=2;
		init();
	}
	/**自動/手動無限循環側滑BannerUtils
	 * @param context context
	 * @param viewpager ViewPager佈局
	 * @param indicator LinearLayout指示器圖標佈局or null
	 * @param selectedId   選中時顏色
	 * @param unSelectedId 未選中顏色
	 * @param listIndicator 對應標題容器or null
	 * @param listDate 對應內容數據容器String
	 * @param iAuto 是否自動輪播
	 */
	public void initBanner(FragmentActivity context, ViewPager viewpager,LinearLayout indicator,int selectedId,int unSelectedId
			,ArrayList<String> listIndicator,ArrayList<String> listDate,boolean iAuto){
		mContext=context;
		mvp=viewpager;
		mfmanager=context.getSupportFragmentManager();
		mindicator=indicator;
		mselectedId=selectedId;
		munSelectedId=unSelectedId;
		mlistIndicator=listIndicator;
		mlist=listDate;
		mtype = iAuto?0:1;
		init();
	}
	private void init(){
		if(mContext==null||mvp==null||mfmanager==null){
			return;
		}
		if(mlist==null||mlist.size()==0){
			return;
		}
		if(mtype==0||mtype==1) {//0自動循環 1手動循環
			totalNum = mlist.size() * 10000;
			currentNum = mlist.size() * 100;
		}
		if(mtype==2) {//2手動
			totalNum = mlist.size();
			currentNum = 0;
		}
		startBanner();
	}
	/**滾動廣告條
	 */
	private void startBanner(){
		PagerAdapter madapter = new PagerAdapter(mfmanager);
		mvp.setAdapter(madapter);
		mvp.setOnPageChangeListener(new OnPageChangeListener() {
			@Override
			public void onPageSelected(int arg0) {
				currentNum=arg0;
				initIndicator();
			}
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
			}
			@Override
			public void onPageScrollStateChanged(int arg0) {
				switch (arg0) {
					case ViewPager.SCROLL_STATE_DRAGGING:
						isStop=true;
						break;
					case ViewPager.SCROLL_STATE_IDLE:
						isStop=false;
						break;
					case ViewPager.SCROLL_STATE_SETTLING:
						isStop=false;
						break;
				}
			}
		});

		autoBanner();
	}
	/**
	 * 自動輪播banner
	 */
	private void autoBanner() {
		if(mtype==0){//自動
			mtimer.cancel();
			mtimer = new Timer();
			mtimer.schedule(new TimerTask() {
				@Override
				public void run() {
					if(!isStop){
						if(mContext==null){
							return;
						}
						mContext.runOnUiThread(new Runnable() {
							@Override
							public void run() {
								currentNum++;
								mvp.setCurrentItem(currentNum%totalNum);
//						Log.e("currentNum",currentNum+"------");
							}
						});
					}
				}
			}, 0, 3000);
		}else{//手動
			mvp.setCurrentItem(currentNum);
//			viewPager.getAdapter().notifyDataSetChanged();
		}
		initIndicator();
	}
	/**
	 * 初始化指示器indicator
	 */
	private void initIndicator(){
		if(mindicator!=null){//指示器
			mindicator.removeAllViews();
			for(int i=0;i<mlist.size();i++){
				if(mContext==null){
					return;
				}
				TextView tvin = new TextView(mContext);
				LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT
						,ActionBar.LayoutParams.WRAP_CONTENT);
				params.weight=1;
				params.gravity= Gravity.CENTER;
				tvin.setLayoutParams(params);

				tvin.setGravity(Gravity.CENTER);
				tvin.setTextSize(8);
				tvin.setText(" ● ");
				if(mlistIndicator!=null){
					tvin.setTextSize(14);//標題大小━
					tvin.setText("  "+mlistIndicator.get(i)+"  ");//中文空格"\u3000"
					final int index = mtype==2 ? i : (mlist.size() * 100)+i;
					tvin.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View view) {
							mvp.setCurrentItem(index,false);
						}
					});
				}
				if(i==currentNum%mlist.size()){
					tvin.setTextColor(mContext.getResources().getColor(mselectedId));//指示器顏色
					tvin.setFocusable(true);
					tvin.setFocusableInTouchMode(true);
					tvin.requestFocus();
				}else{
					tvin.setTextColor(mContext.getResources().getColor(munSelectedId));
				}
				mindicator.addView(tvin);
			}
		}
	}
	/**
	 * 適配器FragmentPagerAdapter
	 */
	public class PagerAdapter extends FragmentPagerAdapter{
		public PagerAdapter(FragmentManager fm){
			super(fm);
		}
		@Override
		public Fragment getItem(int arg0) {
			Object obj = mlist.get(arg0 % mlist.size());
			if (obj instanceof Fragment && mtype==2) {
				return (Fragment)obj;//2手動切換不同Fragment
			}else{
				Fragment fragment=new BannerFragment();
				Bundle bundle=new Bundle();
				if (mlist.get(arg0 % mlist.size())!=null) {
					bundle.putString("FRAGMENTKEY",(String)obj );
				}
				fragment.setArguments(bundle);//傳參
				return fragment;//0自動循環廣告圖片;1手動循環相同排版頁;
			}
		}

		@Override
		public int getCount() {
			return totalNum;
		}
	}

	/**
	 *自定義Fragment--------------------------------------------------------------------------------------
	 */
	public static class BannerFragment extends Fragment {
		private View view;

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
								 Bundle savedInstanceState) {
			if(view==null){
				view = inflater.inflate(android.R.layout.activity_list_item, container, false);//自定義fragment xml
				initUI();
			}
			return view;
		}
		private void initUI() {
			Bundle arg = getArguments();
			if(arg==null){
				return;
			}
			final String fragmentArg = arg.getString("FRAGMENTKEY");//參數
			if (fragmentArg.equals("1")) {
				view.setBackgroundResource(android.R.color.white);
			}else if (fragmentArg.equals("2")) {
				view.setBackgroundResource(android.R.color.black);
			}else{
				view.setBackgroundResource(android.R.color.holo_purple);
			}

//			view.setOnClickListener(new View.OnClickListener() {
//				@Override
//				public void onClick(View v) {
////					自定義點擊事件
//				}
//			});
		}

	}


}

如果同個界面視圖想顯示一個主banner和左右兩個banner可以在viewpager xml設置:android:paddingLeft="30dp" android:paddingRight="30dp" android:clipToPadding="false"

http://blog.csdn.net/a704755096/article/details/48031913

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章