【问题标题】:Android: App/Activity loses connection to ActionBarAndroid:App/Activity 失去与 ActionBar 的连接
【发布时间】:2013-02-04 11:17:09
【问题描述】:

大家早上好,

我的 Activity 的 ActionBar 在放置一段时间后无法保持正常功能。基本上,我根据我所在的 ViewPager 中的哪个页面设置了不同的 ActionBar 视图。 3的中间页面实现了ActionBar.NAVIGATION_MODE_LIST,带有一个列表,用于过滤该页面上ListView的内容。在其他两页上,此列表未显示。我的处理代码:

  public class SectionsPagerAdapter extends MyPagerAdapter  {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment;
        if(i==0){

            ActionBar bar = MyApp.this.getActionBar();
             bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
            fragment   = page1;

        }else if(i==1){
             fragment =  page2;

        }else{
            fragment   =  page3;                        
        }
        return fragment;
    }


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


@Override
public void onPageSelected(int position) {


    if(position== 1  && menuSearch != null){     

            menuSearch.setVisible(true);       
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);   


    }else{   
        if(menuSearch != null){
            menuSearch.setVisible(false);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);    
        }
    }

    currentPage = position;

}

public int getCurrentPage() {

    return currentPage;
}

我目前能够通过启动一个新活动来强制测试失败,然后我可以强制关闭它,当我回到这个主要活动时,ActionBars 下拉菜单会显示在每个页面上。该菜单也失去了与它在第 2 页中执行的过滤属性的连接。

更新 1:

我现在认为我的问题在于我的 ViewPager、ActionBar 和它们控制的 Fragments 之间的脱节。我将以下代码添加到 Activity 的 onNavigationItemSelected 部分:

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {

        Log.i(TAG,"Fragment ID:" + String.valueOf(fragment.getId()));
    if(fragment.isAdded()){
        Log.i(TAG,"fragment.isAdded");
             }

当我第一次运行应用程序时,这些日志会返回以下内容:

片段 ID:2131492869 fragment.isAdded

但是,在我强制崩溃或离开应用程序并稍后返回后,日志返回

片段 ID:0

fragment.isAdded 在这一点上是假的,但我不知道为什么。

任何帮助将不胜感激。

谢谢, 乔什

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

    谁能告诉我为什么会发生这种情况?我应该以某种方式在 onPause 中保存操作栏状态,然后在 onResume 中恢复吗?

    是的,这是因为你没有保存最后一个索引,

    所以基本上你需要做的是

    onResume

    像这样设置 viewPager 当前索引:viewPager.setCurrentItem(lastFragmentIndex);

    我认为您需要将片段保存在 onSaveInstanceState 并在 onRestoreInstanceState 中恢复它们,如下所示:

    protected void onSaveInstanceState(Bundle outState) {
            FragmentManager fm = getSupportFragmentManager();
                fm.putFragment(outState, 1, fragment1);
                fm.putFragment(outState, 2, fragment2);
    }
    

    并恢复

     protected void onRestoreInstanceState(Bundle savedInstanceState) {
                super.onRestoreInstanceState(savedInstanceState);
                FragmentManager fm = getSupportFragmentManager();    
                fragment1 = (Fragment) fm.getFragment(savedInstanceState, 1);
    }
    

    【讨论】:

    • 这并没有解决问题。我在 onPause() 方法中将 lastFragmentIndex 设置为 int。这是故意的吗?
    • 是的,这就是目的,我不确定你是否正确尝试在 onresume 中设置为特定索引,如“1”,并确保每次调用 onresume 时都更改为索引 1
    • 好的,通过一些小的修改,我可以让它工作。但是,我的操作栏中的下拉菜单仍然丢失了指向它所附加的内容提供者的链接。我很困惑,因为在同一个操作栏中还有一个搜索按钮仍在与内容提供者一起使用。
    • 用新信息更新了上述问题。感谢您的帮助。
    猜你喜欢
    • 2019-03-03
    • 2012-08-31
    • 1970-01-01
    • 2017-06-02
    • 2012-05-11
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多