【问题标题】:Fragment Navigation between fragments片段之间的片段导航
【发布时间】:2015-04-22 22:07:51
【问题描述】:

我是 Android 新手,我使用 Fragment。我有活动(MainActivity)和 3 个片段,A->B->C。我需要从 C 片段向后导航到 B,从 B 到 A 并向后导航。我被点击片段 A 看到 A,点击 B 看到 B,点击 C 看到 C,但是当我点击返回时,我的应用程序已关闭。为什么 ? 这是一个我称之为片段的例子

Fragment Subcategory = new Subcategory();
            Bundle bundle = new Bundle();
            bundle.putInt("id", i);
            String title = dba.getTitle(i,true);
            bundle.putString("title", title);
            Subcategory.setArguments(bundle);
            FragmentTransaction transaction_cat = getFragmentManager().beginTransaction();

            transaction_cat.replace(R.id.fragment_container, Subcategory);
            transaction_cat.addToBackStack(null);
            transaction_cat.commit();

我找不到任何简单的示例来告诉我如何在片段之间导航,并且在阅读 this article 之后,我不明白它是如何工作的。 请告诉我,并写下我必须如何做到这一点的例子。

【问题讨论】:

  • 当您提到您想返回导航时,是通过编程方式还是通过返回按钮?
  • 返回键,表示智能手机上的硬件按键。
  • 不知道是否有区别,但是...您可以在 FragmentTransaction 中添加名称:transaction_cat.addToBackStack("subcategory");
  • 我觉得只是加了自定义标签,不重要,我可以不带标签使用FragmentTransaction,不是吗?
  • 您是否在活动中覆盖了 onBackPressed ?

标签: android android-fragments navigation fragment


【解决方案1】:

我认为您可以尝试为活动覆盖方法onBackPressed()

更新:

这是我的代码的一部分。

public class MainActivity extends Activity {

    RelativeLayout mContainer;

    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContainer = (RelativeLayout) findViewById(R.id.fragment_container);
        addFragment();
    }

    private void addFragment() {
        FragmentManager fm = getFragmentManager();
        Fragment f = fm.findFragmentById(R.id.fragment_container);
        if (f == null) {
            f = new MainActivityFragment();
            f.setArguments(getIntent().getExtras());
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.fragment_container, f);
            ft.addToBackStack("" + count++);
            ft.commit();
        }
    }

    private void replaceFrament() {
        FragmentManager fm = getFragmentManager();
        Fragment f;
        f = new BlankFragment();
        f.setArguments(getIntent().getExtras());
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.fragment_container, f);
        ft.addToBackStack("" + count++);
        ft.commit();
    }

    public void onAddFragmentClick(View v) {
        replaceFrament();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }
}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivityFragment">
    <RelativeLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></RelativeLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Fragment"
        android:layout_alignParentBottom="true"
        android:onClick="onAddFragmentClick"/>

</RelativeLayout>

【讨论】:

  • 是的,总是当我按下返回按钮时,onBackPressed() 方法会调用,但是我如何在 onBackPressed 中找到我需要加载哪些片段?通过 addToBackStack("Tag") 中的标签?
  • 创建片段时应使用 addToBackStack("Tag") 。您的代码似乎正确。你试过transaction_cat.replace(R.id.fragment_container, Subcategory).addToBackStack(null).commit();吗?
  • 其实你不需要在你的activity中重写onBackPressed()。超类的 onBackPressed 将正确处理它。
  • transaction_cat.replace(R.id.fragment_container, Subcategory); transaction_cat.addToBackStack(null); transaction_cat.commit(); 和你的代码有什么区别? transaction_cat.replace(R.id.fragment_container, Subcategory).addToBackStack(null).commit();
  • 理论上,这两个代码片段之间存在一些差异。但在这种情况下没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
相关资源
最近更新 更多