片段,参数和ActionBar'向上'导航

时间:2013-09-19 02:55:56

标签: android android-fragments android-actionbar

所以我想尝试一些Fragments的经验,但我发现了一些障碍。

我目前的情况如下。

我有一个活动显示一个List,其内容由'calling'活动发送的Extra Intent参数决定。

此List活动使用XML中声明的ListFragment,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent" android:background="@color/black">
    <fragment class="com.pixlworks.NLC.DirectoryBrowse$ListingFragment"
              android:id="@+id/listing"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />

</FrameLayout>

目前,我通过访问活动意图的额外数据(或保存的Bundle,如果可用)获得直接在Fragment中指示内容类型的参数:

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null)
        mListingType = savedInstanceState.getString(Utils.DIRECTORY_TYPE_STORE_KEY);
    else
        mListingType = getActivity().getIntent().getStringExtra(Utils.DIRECTORY_TYPE_STORE_KEY);

    // get content by type, create and set the adapter

}

现在问题的一部分是我不确定这是将该参数从Activity传递给片段的正确方法。

最重要的是,当使用Action Bar的UP Navigation时,我遇到了这个设置的问题。当我单击此列表活动中的项目时,它将转到显示所选项目详细信息的另一个活动。从这个细节活动:

  • 如果我使用后退按钮,List活动会像往常一样从堆栈中恢复,一切正常。

  • 如果我使用ActionBar的UP(尽管有以下步骤here),似乎创建了一个新实例,而不是使用堆栈中的实例,这个新实例显然没有得到Extra意图中的参数。由于我希望保存的Bundle或Intent中存在该值,因此我的应用程序在这种情况下崩溃。

所以要把事情搞糟,我不确定要遵循哪些以及如何使用'UP'导航使它们正常工作:

A)在活动的字段中保存'type'参数,并将其保存在Activity的Bundle onSaveInstanceState中。在这种情况下,我不知道如何将值传递给Fragment。在这种情况下,我只需要确保UP调用活动列表的现有实例

B)继续我目前在Fragment中保存值而不是Activity的设置,但是再次,如何正确处理UP导航?

我知道这是我在同一时间要问的多种事情,但是它们都是相互联系的,所以我希望我能得到一些帮助。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

UP导航更有意义,可以在同一活动级别内使用。这是您在开发人员页面中遵循的代码的意图。由于您开始了新活动,因此如果您想要返回上一个活动(如后退按钮),则需要先调用finish()来销毁详细信息活动。

至于将数据从活动传递到片段,当您创建片段的新实例时,您可以将数据作为包传递给它,例如:

// in fragment class
public static MyFragment newInstance(Bundle arg) {
    MyFragment f = new MyFragment();
    f.setArguments(arg);
    return f;
}

创建新片段时,可以调用:

// in activity
Bundle arg = new Bundle();
int info = ...;
arg.putInt("INFO",info); 
...
MyFragment mFragment = MyFragment.newInstance(arg);

最后,要获取片段中的数据:

int info = getArguments().getInt("INFO");
...

您应该使用静态方法来实例化它,而不是直接调用MyFragment mFragment = new MyFragment()来实例化片段。这是为了防止在旋转屏幕时可能发生的一些崩溃,并且框架抱怨它找不到公共的空构造函数。


更新

回答你的问题:

1)假设你从活动A开始 - >活动B.然后在活动B中按下向上按钮。根据使用逻辑,向上按钮不会将您带回到活动A,因为它的目的是向上导航一个级别,但仍在内部,活动B.要返回到活动A,您需要调用finish()来首先破坏活动B.

2)如果你的片段是用xml创建的,你仍然可以设置参数。在您的xml中,您为片段android:id="@+id/fragment_id"设置了ID,然后是

// in activity
FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager() if you don't have backward compatibility
MyFragment mFragment = fm.findFragmentById(R.id.fragment_id);
Bundle arg = new Bundle();
// put data blah blah
mFragment.setArguments(arg);

请确保在使用片段之前设置参数。

简单地说,在调用活动之间传递数据时使用intent;如果要将数据从活动传递到片段,则使用bundle