【问题标题】:Android - Back button from FragmentActivity to another FragmentAndroid - 从 FragmentActivity 到另一个 Fragment 的后退按钮
【发布时间】:2014-01-23 11:04:40
【问题描述】:

假设我有一个以 MainActivity A 为根的 ListFragment A。用户按下 List A 中的一个列表并转到 FragmentActivity B。FragmentActivity 包含 3 个片段选项卡。

所以,我想向上导航到 FragmentActivity B,以便它返回 ListFragment A。我该怎么做?

这是我的尝试,到目前为止没有运气:

public class ItemDetailActivity extends FragmentActivity implements ActionBar.TabListener {
    ...

    actionBar.setDisplayHomeAsUpEnabled(true);

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                LatestFragment fragment = new LatestFragment();
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.pager, fragment).addToBackStack(null)
                        .commit();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

LatestFragment 是我要返回的 ListFragment A。

但是,我收到一条错误消息,提示我必须实现 OnLatestSelectedListener,因为在 LatestFragment 中,我已经放置了一个接口来传递值。

我还能进入onOptionsItemSelected 什么?

【问题讨论】:

  • A和B是不同的Activity?
  • 是的。 A 是主要活动(包含导航抽屉),而 B 是项目详细信息(包含选项卡)。

标签: android android-fragments


【解决方案1】:

假设您以标准意图启动 ItemDetailActivity,您应该能够像这样使用后退操作:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            super.onBackPressed();
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

【讨论】:

    【解决方案2】:

    如果片段 A 在您的主要活动中,那么您也可以考虑使用 ActionBar。后退按钮带您进入主要活动。它也很容易实现。

    【讨论】:

    • 它转到了错误的 MainActivity 片段。如何指定才能真正转到 MainActivity 的前一个 Fragment?在这种情况下,LatestFragment。不是其他片段。
    【解决方案3】:

    我假设您的 FragmentActivityB 有返回按钮。 如果没有,你可以得到它

    getActionBar().setDisplayHomeAsUpEnabled(true);
    <meta-data android:name="android.support.PARENT_ACTIVITY"
            android:value="#######" />
    

    现在您可以使用诸如 ViewNumber(1,2,3) 之类的标志来识别以 MainActivity 为根的片段

    实现方法 onMenuItemSelected(....) 并传递 viewNumber 即;您要显示的片段。

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
          //We are implementing this method to respond to the back button on the action bar.
    
          int itemId = item.getItemId();
            switch (itemId) {
            case android.R.id.home:
    
                Intent i = new Intent(this,MainActivity.class);
                i.putExtra("viewNumber",2);
                startActivity(i);
                break;
            }
            return true;
        }//onMenuItemSelected
    

    MainActivity 中使用 Bundles 获取 viewNumber,您可以使用类似这样的方法来计算并显示所需的 Fragment。

    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
    
        case 1:
            fragment = new ListFragmentB();
            break;
        case 2:
            fragment = new ListFragmentA();
            break;
    
        default:
            break;
        }
    
        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();
                }
            }
           }
    

    希望它能解决你的问题。

    【讨论】:

    • 感谢您的解决方案。我认为这可能对我的应用程序中的其他功能有用:)
    • @AimanB 另一个非常重要的可以实现它的区域是Navigation Drawer,因为点击 DrawerList 后显示的每个视图实际上都是一个 Fragment,因此它成为您想要做的相同要求。 :)
    • 我可以将后退按钮和导航抽屉放在一个 Activity 中吗?
    • @AimanB 不行,后退按钮和抽屉按钮的位置默认是一样的,你只能有一个。如果您想同时拥有两者,那么在我看来,您必须更改抽屉按钮的位置,或者可能必须在该特定 Activity 中使用抽屉进行补偿。
    • 哦,嗯。我想我会坚持使用后退按钮 :) 感谢 Soni 的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多