一.用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"