Android 由于片段生命周期,无法获取片段数据
使用选项卡意味着使用片段,出于某些原因,片段在其生命周期中有了新的步骤,如Android 由于片段生命周期,无法获取片段数据,android,android-fragments,Android,Android Fragments,使用选项卡意味着使用片段,出于某些原因,片段在其生命周期中有了新的步骤,如onAttach(Activity) 我的片段填充了参考资料中的一些映射,它是在onAttach()而不是片段构造函数上完成的;因为在构造函数中,getResources()由于缺少活动而引发异常 片段是在MainActivity上创建的,如下所示: @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTran
onAttach(Activity)
我的片段填充了参考资料中的一些映射,它是在
onAttach()
而不是片段构造函数上完成的;因为在构造函数中,getResources()
由于缺少活动而引发异常
片段是在MainActivity
上创建的,如下所示:
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
switch( tab.getPosition() ) {
case 0:
if( fragmentTab0 == null ) {
fragmentTab0 = new MyFragment();
setTabText(0, ((MyFragment)fragmentTab0).getMyName());
}
fragmentTransaction.add(R.id.fragmentContent, fragmentTab0, "TAB0");
break;
这里是我的问题所在,在调用fragment方法getMyName()
时,它使用我前面提到的映射来获取字符串。对getMyName()
的调用是在片段的onAttach()
之前执行的,映射尚未准备好。
我确信我可以找到一种复杂的方法来获得名称(实际上我已经尝试过将活动传递给片段的构造函数并在那里构建映射,这是可行的,但这违背了片段的哲学)
我原以为活动应该在片段构造期间可见,因为片段是从活动创建的,它们最终将被附加,所以延迟活动附加没有意义。
我还认为对newmyfragment()
的调用应该在onAttach()完成后返回。但它在构造函数完成后立即返回
因此,我对这种情况感到不舒服,我想知道我是否以错误的方式使用了片段,如果是这样,问题是,我应该如何正确地调用getMyName()
注意:从片段中可以清楚地看出,onAttach()
和onDetach()
分别与onCreate()
和onDestroy()
无法区分,因此我怀疑它们是否真的必要。onAttach()
在提交片段事务之前不会被调用。在此之前,除非传递这样一个引用,否则片段不会引用创建活动。传递该引用可能是实现您要做的事情的最干净的方法
通常在Android中,标题是由包含活动而不是片段指定的。例如,PreferenceActivity
的xml头文件列出了标题及其相关片段;这些标题不会出现在PreferenceFragment
所使用的首选项xml文件中。同意j_um的意见,您的应用程序由选项卡组成。如果我是这5个标签的主人,我应该知道这5个标签的名称。@SherifelKhatib如果标签是“食品”、“塑料”、“汽车”怎么办?每个标签上的碎片决定了哪些食品、哪些塑料和哪些汽车,你想在每个标签中反映这个选择吗?谢谢你的评论,然后,我将返回将活动
作为参考传递。为了消除您的疑虑:我使用自定义选项卡布局,包含主文本和辅助文本;活动提前知道主要文本。第二个文本是用户选择的结果,所以每个选项卡只知道它;我甚至可能在某个时候做过类似的事情。我只是在指出为什么碎片看起来不是这样设计的——因为它们不是在这一点上我想我不同意你的看法。我们都知道屏幕不动产在智能手机中非常宝贵,我们所做的就是最大限度地利用每个区域。除此之外,如果“他们”不希望我们这样做,就不会有选项卡的自定义布局。只是因为有那么多的灵活性,他们有时会松散地找到可用的地方。我想你可以考虑使用回调界面。这就是Android preference框架在这种情况下处理导航的功能(请参见PreferenceFragment.OnPreferenceStartFragmentCallback
)。因此,您可以在onAttach()
中让片段回调到活动中,而不是让活动在片段准备好之前尝试查询它。