在单个活动中切换片段

时间:2012-06-26 23:50:25

标签: android android-fragments android-activity

我想创建一个Activity,其中显示了用户可以浏览的一种菜单。通过单击项目,将显示一个新屏幕,允许用户提供更多选项(类似向导)。

我想使用Fragment实现此功能,但这对我不起作用 现在我有:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/main_fragmentcontainer" >

    <fragment
        android:id="@+id/mainmenufragment"
        android:name="com.myapp.MainMenuFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <fragment
        android:id="@+id/secondmenufragment"
        android:name="com.myapp.SecondMenuFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>
带有MainMenuFragment

OnClickListener

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.mainmenu, container, false);

    setupButton(view);
    return view;
}

/* Button setup code omitted */

@Override
public void onClick(View v) {
    SherlockFragment secondRunMenuFragment = (SherlockFragment) getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.secondmenufragment);
    FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction();

    transaction.replace(android.R.id.content, secondMenuFragment); //also crashes with R.id.main_fragmentcontainer
    transaction.addToBackStack(null);
    transaction.commit();
}

现在当我按下按钮时,应用程序崩溃了这个logcat:

  

06-27 01:45:26.309:E / AndroidRuntime(8747):java.lang.IllegalStateException:无法更改片段的容器ID SecondMenuFragment {405e2a70#1 id = 0x7f060029}:现在是2131099689 2131099687   06-27 01:45:26.309:E / AndroidRuntime(8747):在android.support.v4.app.BackStackRecord.doAddOp(未知来源)
  06-27 01:45:26.309:E / AndroidRuntime(8747):在android.support.v4.app.BackStackRecord.replace(未知来源)
  06-27 01:45:26.309:E / AndroidRuntime(8747):在android.support.v4.app.BackStackRecord.replace(未知来源)
  06-27 01:45:26.309:E / AndroidRuntime(8747):at com.myapp.MainMenuFragment $ MyButtonOnClickListener.onClick(MainMenuFragment.java:52)

我做错了什么?

3 个答案:

答案 0 :(得分:14)

我创建了这个主要布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"
   tools:context="com.example.fragmentsexample.MainActivity" >

   <FrameLayout 
      android:id="@+id/contentFragment"
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" />

</LinearLayout>

我在FrameActivity中补充:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  Fragment fragment = new Dashboard();
  FragmentManager fm = getSupportFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();
  transaction.replace(R.id.contentFragment, fragment);
  transaction.commit();
  ...
}

我使用相同的代码处理onClick方法,使用Fragment(事件的仪表板):

@Override
public void onClick.... {
  ...
  Fragment fragment = new Events();
  FragmentManager fm = getSupportFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();
  transaction.replace(R.id.contentFragment, fragment); //Container -> R.id.contentFragment
  transaction.commit();
  ...
}

答案 1 :(得分:13)

就个人而言,我不会有任何<fragment>元素。

步骤1:使用<FrameLayout>填充向导的可变部分以及各种按钮,为活动布局填充。

步骤2:在活动的onCreate()中,运行FragmentTransaction将第一个向导页面加载到FrameLayout

步骤3:在“下一次”点击中,运行FragmentTransaction以将FrameLayout的内容替换为向导的下一页。

步骤#4:添加适当的智能功能,以便在按钮无法使用时禁用按钮(例如,返回第一个向导页面)。

此外,您还需要考虑BACK按钮如何与向导中的任何屏幕“后退”按钮一起使用。如果您希望它们的行为相同,则需要将每个事务添加到后台堆栈,并在处理“后退”按钮时从后台堆栈中弹出内容。

总有一天,如果没有人打败我,我会尝试创建一个逐页向导的示例,或者可能是一个可重用的组件。

答案 2 :(得分:0)

另一个选择是使用Roman Nurik的Android-WizardPager

主要特点:

  • 分支,或向导步骤影响的能力 后续步骤的可用性
  • 允许用户在提交之前进行审核
  • 允许用户在向导步骤之间进行自由形式导航
  • 支持必需和可选步骤
  • 支持步骤类(从技术上讲,每一步都是Java类的实例,因此您可以在向导中拥有多个实例)

更多信息here.