use*_*018 6 java android fragment android-dialogfragment android-fragmentactivity
问题的要点是:我正在尝试从FragmentActivity启动DialogFragment。这个DialogFragment的视图包含一个FrameLayout,我想在其中填充一个Fragment。基本上,FragmentActivity启动DialogFragment,然后DialogFragment用Fragment填充它的FrameLayout。我在互联网上搜寻了教程,并整理了一些(在我看来)应该可以使用的东西。但是,无论我尝试什么,我都会不断出错。这是我到目前为止的内容:
这是我的FragmentActivity的布局(文件名为“ activity_interact”):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/activity" >
<Button
android:id="@+id/btnLaunchDialog"
style="@style/btn" />
Run Code Online (Sandbox Code Playgroud)
这是我的DialogFragment的布局(文件名是“ dialog_overview”):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/dialog" >
<FrameLayout
android:id="@+id/frameDisplay"
style="@style/frame" />
Run Code Online (Sandbox Code Playgroud)
这是我的片段的布局(文件名为“ fragment_stats”):
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/table" >
<TableRow style="@style/table" >
<TextView
style="@style/display"
android:gravity="right"
android:text="@string/textStr" />
</TableRow>
Run Code Online (Sandbox Code Playgroud)
这是我的FragmentActivity的Java代码:
public class ActivityInteract extends FragmentActivity implements
OnClickListener {
Button btnLaunchDialog;
@Override
protected void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.activity_interact);
btnLaunchDialog = (Button) findViewById(R.id.btnLaunchDialog);
btnLaunchDialog.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnLaunchDialog:
FragmentManager fm = getSupportFragmentManager();
DialogOverview dialogOverview = new DialogOverview();
dialogOverview.show(fm, "dialog_overview");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的DialogFragment的代码:
public class DialogOverview extends DialogFragment implements OnClickListener {
public DialogOverview() {
}
@Override
public View onCreateView(LayoutInflater li, ViewGroup vg, Bundle b) {
View view = li.inflate(R.layout.dialog_overview, vg);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frameDisplay, new FragmentStats());
ft.commit();
return view;
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的片段代码:
public class FragmentStats extends Fragment {
@Override
public View onCreateView(LayoutInflater li, ViewGroup vg, Bundle b) {
View view = li.inflate(R.layout.fragment_stats, vg);
return view;
}
Run Code Online (Sandbox Code Playgroud)
}
最后,这是logcat错误:
06-11 10:07:29.382: E/AndroidRuntime(30013): java.lang.IllegalArgumentException: No view found for id 0x7f060003 for fragment FragmentStats{4169c928 #1 id=0x7f060003}
Run Code Online (Sandbox Code Playgroud)
我可以看到这是在说我没有Fragment的视图,但是我有...(还是我?)。我在这里迷路了,我们将不胜感激。另外,我会以正确的方式这样做吗?重用FragmentManager会更有效吗?(即,将其从FragmentActivity传递到DialogFragment中)
更新:我删除了将片段加载到DialogFragment中的代码,并且DialogFragment现在显示没有问题。很显然(如logcat错误所暗示的),我的Fragment本身存在问题……但是,它与我在互联网上看到的示例匹配。这让我感到奇怪:以这种方式嵌套片段是否存在问题?显示Fragment的DialogActivity和显示Fragment的DialogFragment使我想开玩笑地说“我们不能再深入了”,但我不知道。我可以嵌套更多碎片吗?
实际上,您可以添加嵌套fragment到DialogFragment,但它不能基于包装的对话框。
不要覆盖onCreateDialog,而是膨胀包含将在 中使用 Fragment 的 ViewGroup 的 View onCreateView。
这样做的结果是您无法使用包装 AlertDialog 的 DialogFragment - 因此,如果您想要肯定按钮和否定按钮,则需要在内容视图中手动创建它们。
另外,请记住,您无法在 XML 中设置片段。您需要在 XML 中声明容器视图并以编程方式执行片段事务。
公共类 MyDialogFragment 扩展 DialogFragment { [...]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.dialog_layout, container);
if (savedInstanceState == null) {
final ChildFragment fragment = [...];
getChildFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4153 次 |
| 最近记录: |