vet*_*tet 5 android android-fragments
我有3个片段的活动和寻呼机.我使用标签进行切换.当我点击某个按钮时,我想用新的替换fragment0.仅当fragment0具有空布局时才有效.如果我在fragment0的布局中设置一些内容(必须有listview)抛出异常:
java.lang.IllegalStateException: Fragment already active
at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:503)
at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:110)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649)
Run Code Online (Sandbox Code Playgroud)
我使用以下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/all_exp_frag"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/all_expenses"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
活动:
public class Activity extends FragmentActivity {
private List<Fragment> fragments;
private MyPagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
fragments = asList(new Fragment0(), new Fragment1(), new Fragment2());
// initialize pager, etc.
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), pager);
}
// handle add new fragment button
@Override
public boolean onOptionsItemSelected(MenuItem item) {
pagerAdapter.replaceCurrentFragment(new Fragment3());
}
public class MyPagerAdapter extends FragmentStatePagerAdapter {
final ViewPager pager;
public MyPagerAdapter(FragmentManager fm, ViewPager pager) {
super(fm);
this.pager = pager;
}
@Override
public CharSequence getPageTitle(int position) {
return fragments.get(position).getFragmentTitle();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
if (object instanceof ExpensesFragment) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
public void replaceCurrentFragment(BaseFragment fragment) {
final int currentPosition = pager.getCurrentItem();
final BaseFragment old_fragment = fragments.get(currentPosition);
if (old_fragment == null) {
return;
}
this.startUpdate(pager);
getSupportFragmentManager()
.beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.remove(old_fragment)
.add(pager.getId(), fragment)
.commitAllowingStateLoss();
fragments.set(currentPosition, fragment);
this.finishUpdate(pager);
this.notifyDataSetChanged(); //IN THIS LINE EXCEPTION IS THROWN WHEN LAYOUT IS NOT EMPTY (contains listview). IF EMPTY - IT WORKS FINE.
listener.onPageSelected(0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序抛出异常在线
this.notifyDataSetChanged();
如果布局不为空.
我找不到解决方法如何避免此异常并正确替换片段.
EDITED
正如我检查的Fragment类包含以下方法:
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
Run Code Online (Sandbox Code Playgroud)
也许我添加片段的方式不正确..
使用Fragment类的方法检查片段是否已添加#isAdded()。然后相应地替换或添加片段:
假设您的片段被称为fragment
// Fragment object
Fragment fragment;
// Check to see if it's added or not like this
if (!fragment.isAdded()) {
// Things you could do here:
// -- Set argument
// -- Begin a transaction
// -- etc...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13223 次 |
| 最近记录: |