【问题标题】:How to create fragments using setArguments/getArguments如何使用 setArguments/getArguments 创建片段
【发布时间】:2012-04-16 09:15:36
【问题描述】:

我正在使用来自的信息在我的应用中创建标签 epidemian answer

我创建了处理选项卡的主类,这个类extends TabActivity 并创建了选项卡:

    Resources res = getResources();
    TabHost tabHost = getTabHost();
    TabHost.TabSpec spec;  
    Intent intent;

    intent = new Intent().setClass(this, stackA.class);    
    spec = tabHost.newTabSpec("tab1").setIndicator("Tab 1",
                      res.getDrawable(android.R.drawable.ic_menu_search))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, stackB.class);
    spec = tabHost.newTabSpec("tab2").setIndicator("Tab 2",
                      res.getDrawable(android.R.drawable.ic_menu_search))
                  .setContent(intent);
    tabHost.addTab(spec);
    tabHost.setCurrentTab(0);

然后为每个选项卡创建 FragmentActivity,这样就可以在每个选项卡中创建堆栈。我的片段已创建:

protected void navigateTo(Fragment newFragment) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.content, newFragment);
    ft.addToBackStack(null);
    ft.commit();
}  

public class fragmentA extends Fragment{
    private LinearLayout ll;
    private FragmentActivity fa;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    fa = super.getActivity();
    ll = (LinearLayout) inflater.inflate(R.layout.fragmenta, container, false);
    Button next = (Button) ll.findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            ((ActivityInTab) getActivity()).navigateTo(new fragmentB());
        }
    });
    return ll;
    }
}

这是有效的。当我在选项卡 1 和片段 B(堆栈中的第一个片段是 A)时,旋转我的设备然后它返回到片段 A 有什么问题。

epidemian 说了一些关于方向和使用 setArguments/getArguments 的内容,但我是 android 编程新手,所以我真的不知道该怎么做:

最后,如果您需要在方向变化中幸存下来,这很重要 您的片段是使用 setArguments/getArguments 创建的。如果 您将在片段的构造函数中设置实例变量 搞砸了。但幸运的是,这很容易解决:只需保存 构造函数中 setArguments 中的所有内容,然后检索那些 在 onCreate 中带有 getArguments 的东西来使用它们。

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:
    int x;
    
    Bundle args = new Bundle();
    
    args.putString("variable", x);
    
    FragmentManager fragmentManager = getFragmentManager();
    
    FragmentTransaction ft = fragmentManager.beginTransaction();
    
    Fragment fragment = Fragment.instantiate(getActivity(), MyFragment.class.getName(), args);
    
    ft.replace(R.id.layout1, fragment);
    
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    
    ft.addToBackStack(null);
    
    ft.commit();
    

    比在片段中:

    getArguments().getInt("variable");
    

    【讨论】:

      【解决方案2】:

      您可以为此使用Fragment.setRetainInstance(true)。见this related question

      【讨论】:

        【解决方案3】:

        您可以防止Activity 由于方向变化而被破坏。将以下行添加到您的 TabActivity 清单中(方向更改 + 键盘可见性更改)

        android:configChanges="keyboardHidden|orientation"
        

        See 此处用于说明。

        setArguments/getArguments 在这里没有帮助。正如他所说,您可以使用它来保存实例变量并在方向更改后检索它们。但是对于上面给定的行,您不需要这样做,因为您的 Activity/Fragments 不会被破坏

        【讨论】:

        • 我已将该行添加到我的活动中,但在旋转时仍会调用 onCreate。
        • -1 因为这通常违反 Android 准则:android-developers.blogspot.com/2009/02/… 您想使用其中指出的机制以及Fragment.setRetainInstance(true)。如果您取消了 Android 处理此类方向变化的能力,那么 XML 布局中的 Fragment 用于平板设备或纵向与横向的不同配置的优势也会丢失。
        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2016-09-20
        相关资源
        最近更新 更多