2012-06-06 16 views
3

Helo。Android:像碎片一样的活动向导

我在这里和其他网站上阅读了很多,但似乎没有人有使用片段作为向导一样的应用程序的工作解决方案。

我试图实现一个,但目前遇到了一些问题。

这里是活动XML与占位符步片段:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <FrameLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/cmd_previous" 
    android:layout_alignParentTop="true" > 
    </FrameLayout> 

    <Button 
    android:id="@+id/cmd_previous" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignRight="@+id/center_separator_buttons" 
    android:text="@string/rpz_cmd_perv" /> 

    <View 
    android:id="@+id/center_separator_buttons" 
    style="@style/wd_center_aligner" 
    android:layout_alignParentBottom="true" /> 

    <Button 
    android:id="@+id/cmd_next" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/center_separator_buttons" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:text="@string/rpz_cmd_next" /> 

</RelativeLayout> 

在OnCreate中我添加的第一个步骤的活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_report_wizard); 

    if (this.getIntent().getExtras() != null) { 
    Bundle extra = this.getIntent().getExtras(); 
    if (extra.containsKey(ISelected.ID_KEY)) { 
     _ID = extra.getLong(ISelected.ID_KEY); 
    } 
    } 

    if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) { 
    _ReportTypeAndName = new ReportWizardTypeAndNameFragment(); 
    _ReportTypeAndName.setArguments(getIntent().getExtras()); 
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, _ReportTypeAndName).commit(); 
    } 
} 

下一按钮,替换当前片段新的一个。这似乎工作正常。

private void runNext(View view) { 
    switch (_CurrentPage) { 
    case ReportTypeAndName: 
     _ReportSelect = new ReportWizardSelectFragment(); 
     _ReportSelect.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, _ReportSelect).addToBackStack(null).commit(); 

     _CurrentPage = ReportWizardPage.ReportSelect; 
     break; 

    case ReportSelect: 
     _CurrentPage = ReportWizardPage.ReportPreview; 
     break; 

    case ReportPreview: 
     _CurrentPage = ReportWizardPage.None; 
     break; 

    default: 
     break; 
    } 
} 

但是在PREVIOUS-Button上,这是行不通的。

private void runPrevious(View view) { 
    switch (_CurrentPage) { 
    case ReportTypeAndName: 
     // Umstellung des Typs 
     _CurrentPage = ReportWizardPage.None; 
     this.finish(); 
     break; 

    case ReportSelect: 
     _ReportTypeAndName = new ReportWizardTypeAndNameFragment(); 
     _ReportTypeAndName.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, _ReportTypeAndName).commit(); 

     _CurrentPage = ReportWizardPage.ReportTypeAndName; 
     break; 

    case ReportPreview: 
     _CurrentPage = ReportWizardPage.ReportSelect; 
     break; 

    default: 
     break; 
    } 
} 

我得到了以下错误(logcat的):

FATAL EXCEPTION: main 
android.view.InflateException: Binary XML file line #13: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
    at de.webducer.android.worktime.beta.ui.fragment.ReportWizardTypeAndNameFragment.onCreateView(ReportWizardTypeAndNameFragment.java:40) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) 
    at android.os.Handler.handleCallback(Handler.java:605) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: Binary XML file line #13: Duplicate id 0x7f05008b, tag null, or parent id 0x0 with another fragment for de.webducer.android.worktime.beta.ui.fragment.ReportTypeSelectorSpinnerFragment 
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:275) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 
    ... 18 more 

片段的第40行是他们的充气

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.frag_report_wizard_1, container, false); 
} 

如何我可以绑定(添加/删除)片段没有得到重复的ID?或者我怎样才能重新使用片段没有新的视图初始化?

enter image description here

+0

看看“造成”部分......它指向其他地方。发布'ReportTypeSelectorSpinnerFragment',也许我们可以搞清楚。 – Barak

回答

2

我使用支持库v4和Sherlock Actionbar。

在尝试使用和不使用BackStack并简化了步骤片段的布局之后,我最终找到了例外的原因。

我在我的第一步骤fragmen使用的片段(selction微调)(参见XML布局)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
    android:id="@+id/lbl_report_type" 
    style="@style/wd_field_label" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="@string/rpz_lbl_report_type" /> 

    <fragment 
    android:id="@+id/frag_report_type_spinner" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/lbl_report_type" 
    class="de.webducer.android.ReportTypeSelectorSpinnerFragment" /> 

    <TextView 
    android:id="@+id/lbl_report_name" 
    style="@style/wd_field_label" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/frag_report_type_spinner" 
    android:text="@string/rpz_lbl_report_name" /> 

    <EditText 
    android:id="@+id/report_name" 
    style="@style/wd_text_edit_pref" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/lbl_report_name" 
    android:hint="@string/rpz_hint_report_name" /> 

    <TextView 
    android:id="@+id/lbl_report_comment" 
    style="@style/wd_field_label" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/report_name" 
    android:text="@string/rpz_lbl_report_comment" /> 

    <EditText 
    android:id="@+id/report_comment" 
    style="@style/wd_text_multi_edit_pref" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/lbl_report_comment" 
    android:hint="@string/rpz_hint_report_comment" /> 

    <TextView 
    android:id="@+id/lbl_active" 
    style="@style/wd_field_label" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/report_comment" 
    android:text="@string/lbl_active" /> 

    <CheckBox 
    android:id="@+id/report_type_active" 
    style="@style/wd_text_edit_pref" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/lbl_active" 
    android:checked="true" 
    android:text="@string/rpz_hint_report_type_active" /> 

</RelativeLayout> 

Ithis 片段产生的异常,因为片段尝试在onCreateView以膨胀内部片段。而这个已经在FragmentManager中使用给定的ID。

我的解决方案现在是销毁内部片段bevore替换为新的片段或从返回堆栈调用之前。

private void runPrevious(View view) { 
    switch (_CurrentPage) { 
    case ReportTypeAndName: 
     // Umstellung des Typs 
     _CurrentPage = ReportWizardPage.None; 
     this.finish(); 
     break; 

    case ReportSelect: 
     if (getSupportFragmentManager().findFragmentById(R.id.frag_report_type_spinner) != null) { 
     getSupportFragmentManager().beginTransaction() 
      .remove(getSupportFragmentManager().findFragmentById(R.id.frag_report_type_spinner)).commit(); 
     } 
     getSupportFragmentManager().popBackStack(); 
     // Umstellung des Typs 
     _CurrentPage = ReportWizardPage.ReportTypeAndName; 
     break; 

    case ReportPreview: 
     _CurrentPage = ReportWizardPage.ReportSelect; 
     break; 

    default: 
     break; 
    } 
    setButtonState(); 
} 

我希望,这个帮助他,试图实施巫师。

+0

你应该选择这个作为接受的答案。 :) – Barak

2

把你的片段在堆栈中,并根据需要给他们打电话回来。

它使用addToBackStack添加到返回堆栈:

list = new ListFragment_List(); 
getFragmentManager().beginTransaction().replace(R.id.pane, listlist).addToBackStack(null).commit(); 

拉回来了使用popBackStack

FragmentManager fm = getActivity().getSupportFragmentManager(); 
fm.popBackStack(); 

注意此代码使用V4支持库从我的应用程序来,所以如果您只为Android 3.0+开发,那么调用片段管理器会略有不同。

+0

我在这里和现在再次写这篇文章之前就试过了。我在LogCat中遇到了同样的异常。 – WebDucer

2

我想你可能想知道,现在有一个工作解决方案,你正在寻找什么。这是一个轻量级Android库,名为WizarDroid

+0

该链接被分解。你能更新它吗?更新了 –

+1

,谢谢你通知我 –