【问题标题】:Fragment disappears using SlidingTabLayout片段使用 SlidingTabLayout 消失
【发布时间】:2015-09-26 12:41:35
【问题描述】:

我正在使用 SlidingTabLayout 来实现滑动选项卡。问题是,当从一个片段返回到选项卡片段时,它会消失。

我将展示应用程序流程以使事情更清楚。

首先,我将 Activity 称为 Fragment:

public class ScreenSlidePageFragment extends Fragment{
    ...
    public View onCreateView(args...){
        ...
        gridView.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                switch(position){
                    case 0:
                        Intent intent = new Intent(getActivity(), FrequencyActivity.class);
                        startActivity(intent);
                        break;
                }
            }
        }
        ...
    }
}

FrequencyActivity的代码如下:

public class FrequencyActivity extends AppCompatActivity{
    ...
    protected void onCreate(Bundle savedInstance){
        ...
        toolbar.setNavigationOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View view){
                onBackPressed();
            }
        });    
    }

    final FragmentManager fm = getSupportFragmentManager();

    Fragment fragment = Fragment.instantiate(getBaseContext(), "com.example.Fragment.FragmentFrequency");

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.home, fragment, "FragFrequency");
    fragmentTransaction.addToBackStack("frequency");
    fragmentTransaction.commit();

    fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
                finish(); //When there is no back stack, finish the activity
            } else {
                //Testing purpose
                int top = fm.getBackStackEntryCount();
                Log.d("BACKSTACK", "Backstack count: " + String.valueOf(top));
                Log.d("BACKSTACK", "Backstack name: " + fm.getBackStackEntryAt(top - 1).getName());
            }
        }
    });
}

FragmentFrequency是包含SlidingTabLayout的,代码如下:

public class FragmentFrequency extends Fragment{
    ...
    //Creates ViewPager adapter
    adapter = new ViewPagerAdapter(activity.getSupportFragmentManager(), titles, numOfTabs);

   //ViewPager
   viewPager = (ViewPager) layout.findViewById(R.id.pager);
   viewPager.setAdapter(adapter);

   //SlidingTabLayout code
   ...
}

最后,加载标签片段的 ViewPagerAdapter

public class ViewPagerAdapter extends FragmentStatePagerAdapter{
    ...
    @Override
    public Fragment getItem(int position){
        if(position == 0)
            return new FragmentTab1();
        else
            return new FragmentTab2();
    }
    ...
}

例如当第一个选项卡被选中时,FragmentTab1被加载,其中包含:

Fragment f = Fragment.instantiate(getActivity(), "com.example.Fragment.FragmentLaunchingFrequency");
FragmentTransaction tx = getActivity().getSupportFragmentManager().beginTransaction();
tx.replace(R.id.home, f, "FragLaunchingFrequency");
tx.addToBackStack("launchingfrequency");
tx.commit();

问题是,当后退动作完成后,FrequencyActivity 失去了对 Fragment 的引用,并显示为空白。此外,滑动标签无法正常工作。

有谁知道如何解决这个问题?我真的别无选择。

谢谢

【问题讨论】:

标签: android android-fragments android-tabs back-stack


【解决方案1】:

我认为您的帖子中有 2 个主要问题。也许为另一个问题再发一篇文章。 现在,我可以解决您的问题“问题是,完成后退操作后,FrequencyActivity 失去了 Fragment 的引用并显示为空白”。 你的代码:

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.home, fragment, "FragFrequency");
fragmentTransaction.addToBackStack("frequency");
fragmentTransaction.commit();

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
    ...

注意事项:

  • 您不能在同一个 FragmentManager 中调用 addToBackStack() 并使用 OnBackStackChangedListener()。这看起来很复杂。

代码建议:

  • 删除addOnBackStackChangedListener() 的使用,看看会发生什么。

具体代码建议:

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
                finish(); //When there is no back stack, finish the activity
            } else {
// Call FragmentManager.findFragmentByTag(String tag)
// Call FragmentTransaction.show() after getting the Fragment.

            }
        }
    });

注意:注意 else 块管理 Fragment 而不是依赖于 BackStack(addToBackStack 方法)。

【讨论】:

  • 谢谢@The Original Android。我通过添加一个 Activity 并添加提到的片段来解决这个问题,所以从它返回时导航是可以的。我会尽快用分辨率编辑我的问题。
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多