我尝试构建基于ListFragment
的基本应用程序,该应用程序根据用户输入从一个ListFragment
转换到另一个ListView
。
我使用Android系统为ListFragment
充气的默认onCreateView()
,因此我不会覆盖ListFragment
。
要设置GlobalLayoutListener
周围的边距,我添加onActivityCreated()
。
现在,当我启动应用程序时,包含默认片段的第一个屏幕会正确显示,边距设置正确。
但是,只要我点击主布局中的图像,该图像调用到具有相同GlobalLayoutListener
方法且Content View not created yet
作为第一个片段的第二个片段的转换,我就会感到害怕{当我尝试访问第二个片段中的OnGlobalLayout()
时,ListView
方法出现{1}}错误。
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
R.layout.listcommon, R.id.label, MAIN_TITLES));
ListView lv = getListView();
lv.setDivider(null);
lv.setDividerHeight(0);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lv.setItemChecked(0, true);
lv.setSelection(0);
ViewTreeObserver observer = getListView().getViewTreeObserver();
observer.addOnGlobalLayoutListener(fragmentLayoutListener);
}
ViewTreeObserver.OnGlobalLayoutListener fragmentLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout() {
//Crashes here for second fragment
ListView listView = getListView();
FrameLayout.LayoutParams params = (LayoutParams) listView.getLayoutParams();
params.setMargins(10, 10, 10, 10);
}
};
以下是主要布局:(默认片段通过FragmentTransaction.add()
添加到第一个FrameLayout
)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:background="#00000000">
<FrameLayout
android:id="@+id/TitlesContainer"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="40"
android:layout_margin="10dip"
android:background="@drawable/titlesbg"
>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="60"
android:background="#00000000"
>
<ImageView
android:id="@+id/imageView_clickWheel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/clickImage" />
</FrameLayout>
</LinearLayout>
有什么想法我应该做什么来避免遇到这个错误?
毕竟我是否应该超越onCreateView()
并夸大自定义列表视图(但我没有这样的需求)?
编辑:
以下是我如何将默认片段添加到主要活动的onCreate()
:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
TitlesFragment fragment = (TitlesFragment) fragmentManager.findFragmentByTag(MAIN_SCREEN_TAG);
if (fragment == null){
fragment = TitlesFragment.newInstance(SCREEN_MAIN);
fragmentTransaction.add(R.id.TitlesContainer, fragment, MAIN_SCREEN_TAG);
} else {
fragmentTransaction.add(R.id.TitlesContainer, fragment);
}
fragmentTransaction.commit();
要执行转换,我就是这样做的:
fragment = (TitlesFragment) fragmentManager.findFragmentByTag(SECOND_FRAGMENT_TAG);
if (fragment == null){
fragment = TitlesFragment.newInstance(SECOND_FRAGMENT);
fragmentTransaction.replace(R.id.TitlesContainer, fragment, SECOND_FRAGMENT_TAG);
} else {
fragmentTransaction.replace(R.id.TitlesContainer, fragment);
}
fragmentTransaction.commit();
答案 0 :(得分:0)
由于你没有提及它并且没有显示完整的代码,我猜这里有点,但以下可能是你问题的原因。
我认为您需要先创建视图,然后才能访问它的元素。请参阅here和here。
我的一个项目的一个例子:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.leftlistfragment, container, false);
return v;
}
修改强>
也许问题在于您创建片段的方式(我不熟悉您使用标签的方法)。也许这对你也有用:
titleFrag = new TitlesFragment();
getFragmentManager().beginTransaction()
.replace(R.id.TitlesContainer, titleFrag, SECOND_FRAGMENT_TAG).commit();
答案 1 :(得分:0)
我摆脱了OnGlobalLayoutListener。相反,我在第一个FrameLayout上设置'layout_padding'属性来设置它所包含的Fragment上的边距。