Java 如何使用setArguments/getArguments创建片段

Java 如何使用setArguments/getArguments创建片段,java,android,android-fragments,Java,Android,Android Fragments,我正在使用来自的信息在我的应用程序中创建选项卡 我创建了处理选项卡的主类,该类扩展了TabActivity并创建了选项卡: Resources res = getResources(); TabHost tabHost = getTabHost(); TabHost.TabSpec spec; Intent intent; intent = new Intent().setClass(this, stackA.class); spe

我正在使用来自的信息在我的应用程序中创建选项卡

我创建了处理选项卡的主类,该类
扩展了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的对象可以使用它们


您可以防止
活动
因方向改变而被破坏。将以下行添加到
选项卡活动的清单中(方向更改+键盘可见性更改)

这里是描述

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

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");

您可以为此使用
Fragment.setRetainInstance(true)
。请参阅。

我已将该行添加到我的活动中,但在轮换时仍会调用onCreate.-1,因为这通常违反了Android指南:您希望使用其中指示的机制,以及
Fragment.setRetainInstance(true)
。如果去掉Android处理这种方向变化的能力,那么用于平板设备或纵向与横向不同配置的XML布局片段的好处也就失去了。
getArguments().getInt("variable");