cor*_*eno 12 java android android-fragments
我想让我的应用程序更加平板电脑,所以我正在尝试学习片段.我想要典型的双窗格布局,左侧是"导航",然后单击其中一个元素,它会更改右侧的片段.
我可以复制左侧使用ListFragment的教程,如果单击其中一个,它会更新右侧的"详细信息"片段.
我已尽力复制该代码,只使用一个LinearLayout,左侧有按钮,这样如果单击一个按钮,它会在右侧加载相应的片段,但它不起作用.当我提交FragmentTransaction时,我得到java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.了孩子的父母是什么,为什么我必须在其上调用removeView?
我正在尝试将片段加载到FrameLayout中,但我也尝试替换布局中的另一个片段,但仍然得到错误.
理想情况下,我希望左侧片段占据整个屏幕,直到按下按钮需要从左侧进入片段,但我想一次有一个问题.
public class FragmentExample2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Run Code Online (Sandbox Code Playgroud)
public class SelectorFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View fragment = inflater.inflate(R.layout.selector, container);
Button button1 = (Button) fragment.findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.detail_holder, new DetailsFragment(), "stuff").commit();
}
});
return fragment;
}
}
Run Code Online (Sandbox Code Playgroud)
public class DetailsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.details, container);
}
}
Run Code Online (Sandbox Code Playgroud)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment class="com.coreno.testfragment.SelectorFragment"
android:id="@+id/select"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<fragment class="com.coreno.testfragment.DetailsFragment"
android:id="@+id/detail_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
/>
<!--
<FrameLayout
android:id="@+id/detail_holder"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2"
/>
-->
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
Ale*_*ran 12
在扩展布局xml文件时,请不要指定父视图.听起来非常违反直觉,因为没有说明你放置这个膨胀的视图的位置但是它有效.
因此,例如,在SelectorFragment中更改行:
View fragment = inflater.inflate(R.layout.selector, container);
Run Code Online (Sandbox Code Playgroud)
至
View fragment = inflater.inflate(R.layout.selector, null);
Run Code Online (Sandbox Code Playgroud)
甚至更好
View fragment = inflater.inflate(R.layout.selector, container, false);
Run Code Online (Sandbox Code Playgroud)
不要忘记在DetailsFragment中也这样做.
小智 8
当你在Fragment的getView方法中扩展布局时,你必须使用下一个inflate方法:inflater.inflate(R.layout.details,container,false);
关键是第三个参数.将膨胀的布局附加到容器必须是假的,因为系统已经完成了它.如果为true或未指示,则创建冗余组视图.
| 归档时间: |
|
| 查看次数: |
26679 次 |
| 最近记录: |