FragmentPagerAdapter 实现tab切换时 直接点击底部 tab按钮时,跨度大出现界面空白怎么

Android 码拜 8年前 (2016-05-11) 1567次浏览
首先,大家都知道 FragmentPagerAdapter和 FragmentStatePagerAdapter不同,只要Fragment被加载(回调了onAttach和onCreate),就不会被销毁(不会调用onDestroy和 onDetach),本人用ViewPager和FragmentPagerAdapter构建了一个tab切换应用,底部的按钮用的TextView,一共四个按钮,但是问题来了:
本人没有调用 ViewPager的 setOffscreenPageLimit方法,也就是说是默认值 1,只要Fragment被加载后,ViewPager只会显示当前页左右各一页,其他的页不会显示(不会销毁),本人先从第一个到第四个标签依次点击,让全部Fragment都加载完毕,然后当本人从第一个标签直接切换到第四个时,第四页出现空白,但是从第四个直接切换到第一个就不会出现空白,这是怎么回事?
不要说什么没被加载之类的, FragmentPagerAdapter只要被加载过就不会被销毁,本人已经试验过,setOffscreenPageLimit没有设置默认为1只不过是不显示其他的而已(不会调用onCreateView而已),全部的Fragment都已经加载过了,不清楚的是从第四个标签切换到第一个就是正常的,但是从第一个标签切换到第四个第四个就会显示空白,请求大牛指点迷津。
此时四个Fragment都已加载完毕,第一个Tab的界面
FragmentPagerAdapter 实现tab切换时 直接点击底部 tab按钮时,跨度大出现界面空白怎么
从第一个直接点击底部按钮切换到第四个出现空白,但是从第四个直接点击底部按钮切换到第一个界面正常显示
FragmentPagerAdapter 实现tab切换时 直接点击底部 tab按钮时,跨度大出现界面空白怎么
附上代码:
主Activity

package com.example.viewpagertabtest;
import java.util.*;
import android.app.*;
import android.graphics.*;
import android.os.*;
import android.support.v13.app.*;
import android.support.v4.view.*;
import android.support.v4.view.ViewPager.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
public class MainActivity extends Activity implements OnClickListener {
  private ViewPager mPager;
  private FragmentPagerAdapter mAdapter;
  private TextView mTab1, mTab2, mTab3, mTab4;
  private List<Fragment> mList;
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    initView();
    initEvent();
    
    // 设置切换监听器
    mPager.setOnPageChangeListener(new OnPageChangeListener()
    {
      @Override
      public void onPageSelected(int position)
      {
        resetAllTab();
        selector(position);
      }
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
      {
      }
      @Override
      public void onPageScrollStateChanged(int state)
      {
      }
    });
    
    // 设置ViewPager的切换动画,3.0以上版本有效
    mPager.setPageTransformer(false, new PageTransformer()
    {
      private static final float MIN_SCALE = 0.2f;
      
      @Override
      public void transformPage(View page, float position)
      {
        int pageWidth = page.getWidth();
        
        //左侧不可见Pager
        if(position < -1)
        {
          page.setAlpha(0);
          page.setRotationY(0);
        }
        
        //左侧可见Pager
        else if(position <= 0)
        {
          page.setAlpha(1);
          page.setTranslationX(0);
          page.setScaleX(1);
          page.setScaleY(1);
          page.setRotationY(0);
        }
        
        //右侧可见Pager
        else if(position <= 1)
        {
          page.setAlpha(1 - position);
          page.setPivotX(page.getMeasuredWidth()/2);
          page.setPivotY(page.getMeasuredHeight()/2);
          page.setRotationY(position * 180);
          page.setTranslationX(pageWidth * -position);
          float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
          page.setScaleX(scaleFactor);
          page.setScaleY(scaleFactor);
        }
        
        //右侧不可见Pager
        else
        {
          page.setAlpha(0);
          page.setRotationY(180);
        }
      }
    });
  }
  //初始化 View
  private void initView()
  {
    mTab1 = (TextView)findViewById(R.id.weixin);
    mTab2 = (TextView)findViewById(R.id.friend);
    mTab3 = (TextView)findViewById(R.id.address);
    mTab4 = (TextView)findViewById(R.id.setting);
    mList = new ArrayList<Fragment>();
    mList.add(new Fragment1());
    mList.add(new Fragment2());
    mList.add(new Fragment3());
    mList.add(new Fragment4());
    mAdapter = new MyAdapter(getFragmentManager(), mList);
    mPager = (ViewPager)findViewById(R.id.view_pager);
    mPager.setAdapter(mAdapter);
    //mPager.setOffscreenPageLimit(3);
  }
  //初始化监听事件
  private void initEvent()
  {
    mTab1.setOnClickListener(this);
    mTab2.setOnClickListener(this);
    mTab3.setOnClickListener(this);
    mTab4.setOnClickListener(this);
  }
  //点击事件处理
  @Override
  public void onClick(View v)
  {
    resetAllTab();
    switch(v.getId())
    {
    case R.id.weixin:
      selector(0);
      mPager.setCurrentItem(0, false);
      break;
    case R.id.friend:
      selector(1);
      mPager.setCurrentItem(1, false);
      break;
    case R.id.address:
      selector(2);
      mPager.setCurrentItem(2, false);
      break;
    case R.id.setting:
      selector(3);
      mPager.setCurrentItem(3, false);
      break;
    }
  }
  //复位全部底部按钮状态
  private void resetAllTab()
  {
    mTab1.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_weixin_normal, 0, 0);
    mTab1.setTextColor(Color.WHITE);
    mTab2.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_find_frd_normal, 0, 0);
    mTab2.setTextColor(Color.WHITE);
    mTab3.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_address_normal, 0, 0);
    mTab3.setTextColor(Color.WHITE);
    mTab4.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_settings_normal, 0, 0);
    mTab4.setTextColor(Color.WHITE);
  }
  //底部按钮状态选择器
  private void selector(int position)
  {
    switch(position)
    {
    case 0:
      mTab1.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_weixin_pressed, 0, 0);
      mTab1.setTextColor(Color.GREEN);
      break;
    case 1:
      mTab2.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_find_frd_pressed, 0, 0);
      mTab2.setTextColor(Color.GREEN);
      break;
    case 2:
      mTab3.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_address_pressed, 0, 0);
      mTab3.setTextColor(Color.GREEN);
      break;
    case 3:
      mTab4.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.tab_settings_pressed, 0, 0);
      mTab4.setTextColor(Color.GREEN);
      break;
    }
  }
}

Fragment

package com.example.viewpagertabtest;
import android.os.*;
import android.util.*;
import android.view.*;
import android.app.*;
public class Fragment1 extends Fragment {
  
  @Override
  public void onAttach(Activity activity)
  {
    Log.i("Fragment1", "绑定");
    super.onAttach(activity);
  }
  
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    Log.i("Fragment1", "显示");
    return inflater.inflate(R.layout.fragment1, container, false);
  }
  @Override
  public void onDestroyView()
  {
    Log.i("Fragment1", "不显示");
    super.onDestroyView();
  }
  
  @Override
  public void onDestroy()
  {
    Log.i("Fragment1", "销毁");
    super.onDestroy();
  }
  @Override
  public void onDetach()
  {
    Log.i("Fragment1", "解绑定");
    super.onDetach();
  }
}

适配器

package com.example.viewpagertabtest;
import java.util.*;
import android.app.*;
import android.support.v13.app.*;
public class MyAdapter extends FragmentPagerAdapter {
  private List<Fragment> mList;
  public MyAdapter(FragmentManager fm, List<Fragment> list)
  {
    super(fm);
    mList = list;
  }
  @Override
  public Fragment getItem(int position)
  {
    return mList.get(position);
  }
  @Override
  public int getCount()
  {
    return mList.size();
  }
}
解决方案

5

没发现哪不对哦。

10

还真没看出来哪儿有问题。
你可以重写Fragment里的setUserVisibleHint函数,看看点完设置后切换到第一个tab后再进入设置,这个函数里的状态对不对

@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		if (isVisibleToUser) {
			//相当于Fragment的onResume
			Log.e(TAG, "[MainFragment] setUserVisibleHint Resume");
		} else {
			//相当于Fragment的onPause
			Log.e(TAG, "[MainFragment] setUserVisibleHint Pause");
		}
	}

5

从微信切换到通讯录是不是同样显示空白?

15

引用:
Quote: 引用:

还真没看出来哪儿有问题。
你可以重写Fragment里的setUserVisibleHint函数,看看点完设置后切换到第一个tab后再进入设置,这个函数里的状态对不对

@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		if (isVisibleToUser) {
			//相当于Fragment的onResume
			Log.e(TAG, "[MainFragment] setUserVisibleHint Resume");
		} else {
			//相当于Fragment的onPause
			Log.e(TAG, "[MainFragment] setUserVisibleHint Pause");
		}
	}

本人试了下,状态都是true,但是就是不显示….是不是有BUG啊

那有问题啊,当你首次切换到设置时,设置的fragment里isVisibleToUser应该是true,然后你再切到微信的fragment时,此时设置里的isVisibleToUser应该会收到false才对。

5

根据楼上提供的方法,原因应该很快找到  标志位不对哦

10

试试把4个fragment作为成员变量,而不是直接new完就add到list里,
另外,你的这几个fragment都是分别继承系统fragment重新的么?onCreateView里加载的layout id都是不通的layout吧?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明FragmentPagerAdapter 实现tab切换时 直接点击底部 tab按钮时,跨度大出现界面空白怎么
喜欢 (0)
[1034331897@qq.com]
分享 (0)