如何使用setArguments / getArguments创建片段

时间:2012-04-16 09:15:37

标签: java android android-fragments

我正在使用来自的信息在我的应用中创建标签 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,这是错误的。

流行病说了一些关于方向和使用setArguments / getArguments的东西,但我是android编程的新手,所以我真的不知道怎么做:

  

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

您可以使用Fragment.setRetainInstance(true)。请参阅this related question

答案 2 :(得分:-3)

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

android:configChanges="keyboardHidden|orientation"

See这里有说明。

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