【问题标题】:How to update the ActionBar Spinner when pressing the back button按下后退按钮时如何更新 ActionBar Spinner
【发布时间】:2015-08-02 07:34:56
【问题描述】:

我很快就要发疯了,很快就阅读了 10 多个小时的 Google 搜索结果,但没有任何运气。

我想我会放弃使用微调器的整个想法而只使用标签,但我仍然没有找到解决方案,这让我很恼火。所以我希望任何人都可以帮助我理解这个问题。

我创建的项目有一个 MainActivityContainer(主 FrameLayout),然后是多个片段(不同的布局),它们首先添加到 MainActivityContainer 中,然后在 MainActivityContainer 中替换。

所以应用程序只打开一个活动,而不是通过不同的片段更改页面。这使得换页变得超级快。

除了 ActionBar Spinner 之外的所有东西都很好用。按下后退按钮时它不会更新,即它仍然显示最后一个片段的值。

我想使用微调器,这样我就可以轻松地在不同的片段之间导航。

应用起始页如下所示: http://1drv.ms/1jkJpy2

微调器项目是: 1.首页,2.ImageBtn1,3.ImageBtn2等

所以我可以通过单击图像按钮或使用微调器到达每个目的地。这是我想要的功能。

但是,如果我单击 imagebutton(而不是使用微调器),微调器(主页)中的值不会更改为 ImageBtn1。因此,即使我在 ImageBtn1 的页面上,微调器也会显示“主页”。

我通过使用 actionBar.setSelectedNavigationItem(1); 解决了这个问题;在 ImageButton 的方法中。所以 imagebuttons 手动使用微调器方法。即使在开始页面上按下图像按钮,这也会将微调器设置为正确的值。

这一切都很好,直到我按下后退按钮。比我再次遇到同样的问题,微调器值没有更新。

所以请向我解释如何解决这个问题。换句话说:如何使用带有一个活动和许多片段的微调器操作栏,并且仍然获得返回按钮来更新微调器。我已经开始尝试使用 onBackPressed() 方法。但是必须有一种更简单的方法来实现我想做的事情???

【问题讨论】:

    标签: android spinner


    【解决方案1】:

    好的,我知道如何更新操作栏中的导航微调器了!

    在我的问题中,我总是调用 actionBar.setSelectedNavigationItem(int);在活动的 onCreate() 方法中。但是,仅在首次创建新活动时才调用 onCreate()。因此,每当我按下后退按钮时,不会调用 onCreate() 并且不会更新导航微调器。然而,onResume() 函数总是在用户可见活动时被调用(无论活动是刚刚创建还是用户按下后退按钮)。所以我在 onResume() 中简单地调用了 actionBar.setSelectedNavigationItem(int) 并且导航微调器现在会在用户按下返回时更新!。

    但是,由于您使用的是一个包含多个片段的活动,因此您可能应该将 actionBar.setSelectedNavigationItem(int) 放在片段的 onResume() 中,而不是活动中。那应该行得通!

    我想这是真正学习和内化活动和片段生命周期的好案例。回到对我来说更多的学习:)。

    【讨论】:

    • 所以你完全删除了“@Override public void onBackPressed()”?
    • 刚刚试了一下,效果很好。这是我目前拥有的更简单的解决方案。我把它复杂化了,做了一个 25 行长的方法,叫做 UpdateSpinner(),每次按下后面的 btn 时都会调用它。您的解决方案只有 1 行,并将该代码放在片段中,而不是现在所在的 MainActivity(扩展 fragmentActivity)中。
    • 是的,删除了 onBackPressed()。很高兴它对你有用。
    【解决方案2】:

    我想知道您是否设法找到解决方案?我和你有类似的问题。

    在活动中,在 onBackPressed() 方法中,尝试调用 getSupportFragmentManager().findFragmentByTag(TAG);其中 TAG 是您在添加每个帧时可以提供的字符串(每个片段有不同的 TAG)。

    所以在代码中,当您将片段放入时:

    getSupportFragmentManager().beginTransaction().add(R.id...., new MyFragment(), "TAG1");
    

    那么 onBackPressed 方法将如下所示:

    @Override
    public void onBackPressed() {
        MyFragment myFragment = (MyFragment)getSupportFragmentManager().findFragmentByTag("TAG1");
    if (myFragment.isVisible()) {
        getActionBar().setSelectedNavigationItem(int);
    }
    
    }
    

    让我知道这是否有效!

    【讨论】:

    • 你似乎完全明白我的意思。怕没人明白我的问题。我没有放弃这个想法,我已经有了解决方案。它看起来和你写的一样安静。稍后我会看看是否可以用我的解决方案替换您的解决方案,因为我的解决方案要长一些……您写的内容对您有用吗?我记得这整件事是个危险,因为我希望微调器也能像 Back Btn 一样工作。 IE。如果用户使用微调器导航,则返回到片段的先前状态。所以那个片段上的数据仍然存在。
    • 好吧,我遇到了与您遇到的类似的问题,但使用的是活动而不是片段(所以我在回答中写的解决方案正是我认为可能有效的解决方案,但事实并非如此测试)。如果您想查看stackoverflow.com/questions/24635889/…,我实际上只是发布了我的问题
    • 好的,稍后将对其进行测试,如果有效,我会将其标记为答案;)。我快速浏览了您的问题,您似乎遇到了您所说的确切问题。背面 btn 无法正常工作。我解决了它,所以当我有时间时会看看你的问题。快速浏览:添加 super.onBackPressed();在 actionBar.setSelectedNavigationItem(1) 之后; ..
    【解决方案3】:

    切勿使用 NAVIGATION_MODE_LIST 和 onNavigationItemSelected 不值得!

         @Override
         public boolean onNavigationItemSelected(int position, long itemId)
    
        You also cannot use menu's to do this:
    
       @Override public boolean onCreateOptionsMenu(Menu menu)
      {
        getMenuInflater().inflate(R.menu.activity_main, menu);
    
    due to inflation ordering.
    Reasons:
    
    (1) it generates a "hidden" spinner, for which you can not get the id.
    (2) you cannot customize this spinner
    (3) you save 30 lines of code, but are permanently limited if you want to add a second bi-directional spinner 
    (4) not even in the special case of "simple code" (one spinner), you lose to much.
    (5) you cannot use tabs.
    (6) without the id, you have no chance with fragments.
    
    the key is actionBar.setCustomView(R.layout.action_bar_custom);
    and spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()...
    for each spinner.
    Trust me I lost hours trying each solution.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2016-10-27
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多