所以我想尝试一些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导航?
我知道这是我在同一时间要问的多种事情,但是它们都是相互联系的,所以我希望我能得到一些帮助。
提前感谢您的帮助!
答案 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
。