我有一个带有一个片段的MainActivity。我在pager中有一个ListView,它位于MainActivity的片段内。现在,当设备方向改变时,ListView没有显示之前显示的任何项目:
MainFragment.java:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
if (myGrp == null)
myGrp = new ArrayList<List<String>>();
mActivityAdapter = new MyGroupsAdapter(myContext, myGrp);
mSectionsPagerAdapter = new SectionsPagerAdapter(
myContext.getSupportFragmentManager());
mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setCurrentItem(1);
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section3).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
case 2:
return getString(R.string.title_section1).toUpperCase(l);
}
return null;
}
}
public View onCreateView(LayoutInflater inflater,
final ViewGroup container, Bundle savedInstanceState) {
View dummyView = null;
if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
dummyView = inflater.inflate(R.layout.inbox_fragment,
container, false);
ListView mListView = (ListView) dummyView
.findViewById(R.id.inbox_listview);
mListView.setAdapter(inboxAdapter);
mListView
.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0,
View arg1, int position, long id) {
MainFragment fragment = new MainFragment();
fragment.inboxItem_onLongClick(id);
return false;
}
});
} else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
dummyView = inflater.inflate(R.layout.chat_fragment, container,
false);
ListView mListView = (ListView) dummyView
.findViewById(R.id.chatGroupList);
mListView.setAdapter(mActivityAdapter);
} else if (getArguments().getInt(ARG_SECTION_NUMBER) == 3) {
//any things
}
}
}
@Override
public void onResume() {
super.onResume();
SharedPreferences prfs = myContext.getSharedPreferences("user_info",
Context.MODE_PRIVATE);
GroupsSaved = prfs.getBoolean("GroupsSaved", false);
if (myGrp == null || myGrp.size() == 0)
getMyGroups();
Global.nowChatGrpID = 0;
mActivityAdapter.notifyDataSetChanged();
}
答案 0 :(得分:0)
替换此代码:
myContext.getSupportFragmentManager();
到
getChildFragmentManager();
这可行。
如果您想拥有一个充当片段容器的片段,则必须使用片段的getChildFragmentManager
方法。如果您使用getSupportFragmentManager
,您基本上将使用片段管理器,其行为与活动生命周期的方式相同,而不是片段的方式。
例如,我有一个包含ViewPager的片段 - 它被称为CollectionsFragment。所以我在其中显示了3个片段作为标签:AllCollectionsFragment,MyCollectionsFragment,FavouriteCollectionsFragment。我将getActivity().getSupportFragmentManager()
提供给我正在使用的FragmentStatePagerAdapter。
因此,这会导致以下行为 - 不会调用3个选项卡片段的onDestroyView/onDestroy/onDetach/onStop
方法。当我改为使用getChildFragmentManager
时一切正常。
如果您需要,可以查看两种方法的文档:
getChildFragmentManager():
返回一个私有的FragmentManager,用于放置和管理此片段内的片段。
getSupportFragmentManager():
返回FragmentManager以与与此片段活动相关联的片段进行交互。
答案 1 :(得分:0)
当您更改方向时,可能会重新加载您的活动,尝试将其添加到您的清单中:
<activity android:name=".yourActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
...
解决您的问题?
答案 2 :(得分:0)
为确保您的Activity
不会在每次更改方向时重新加载,您应在清单中声明android:configChanges="keyboardHidden|orientation|screenSize"
。这样可以确保“活动”的状态保留,并且在方向更改后不会重新加载。