11

我想创建一个Activity显示用户可以通过的菜单。通过单击一个项目,将显示一个新屏幕,允许用户进行更多选项(类似向导)。

我想用Fragments 来实现这个,但它对我不起作用。
现在我有:

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

我究竟做错了什么?

4

3 回答 3

17

我创建了这个主要布局:

<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 方法,更改片段(事件仪表板):

@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();
  ...
}
于 2013-07-25T20:06:48.223 回答
16

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

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

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

步骤#3:单击“下一步”,运行 aFragmentTransaction以将向导的下一页内容替换为FrameLayout向导的下一页。

步骤#4:添加适当的智能以在按钮不可用时禁用它们(例如,返回第一个向导页面)。

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

总有一天,如果没有人比我做得更好,我会尝试创建一个以片段为向导的示例,或者可能是一个可重用的组件。

于 2012-06-26T23:59:38.757 回答
0

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

主要特点:

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

更多信息在这里。

于 2015-01-19T00:24:09.767 回答