0

所以我试图获得一些片段的经验,但我发现了一些障碍。

我目前的情况如下。

我有一个显示列表的活动,其内容由“调用”活动发送的额外意图参数确定。

此 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>

目前,我通过访问 Activity Intent 的 Extra 数据(或保存的 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

}

现在我的部分问题是我不确定这是将参数从活动“传递”到片段的正确方法。

最重要的是,在使用操作栏的向上导航时,我遇到了此设置的问题。当我单击此列表活动中的一个项目时,它会转到另一个显示所选项目详细信息的活动。从这个细节活动:

  • 如果我使用后退按钮,List Activity 会像往常一样从堆栈中返回,并且一切正常。

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

因此,为了归结起来,我不确定要遵循哪些以及如何使它们与“向上”导航正常工作:

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

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

我知道这是我同时在这里问的多件事,但它们都是相互关联的,所以我希望我能在这方面得到一些帮助。

提前感谢您的帮助!

4

1 回答 1

0

在同一活动级别中使用向上导航更有意义。这就是您在开发人员页面中遵循的代码的意图。因为你开始了一个新的活动,如果你想像返回按钮一样返回之前的活动,你需要先调用finish()来销毁细节活动。

至于从activity传递数据到fragment,当你创建一个新的fragment实例时,你可以将数据作为bundle传递给它,例如:

// 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 中,您为片段设置了一个 id android:id="@+id/fragment_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就是在调用activity之间传递数据的时候使用;bundle当您想要将数据从活动传递到片段时使用。

于 2013-09-19T03:25:27.767 回答