Это будет последний вопрос, который у меня есть о вкладках, я обещаю :) (возможно) Итак, из предыдущих вопросов и попыток и ошибок у меня есть FragmentPagerAdapter под названием PagerAdapter, который создает несколько вкладок, а также дает я могу динамически создавать новые вкладки. Проблема заключается в том, что новые вкладки будут всегда вставляются справа от моих существующих вкладок:Добавить вкладки влево с помощью FragmentPagerAdapter
(Изображение:
Я попытался следующие:
Добавить статическую запись в " null ", который будет пропущен при создании встроенного набора вкладок, а затем при создании« вкладки Temp »я мог бы переопределить эту запись на любой фрагмент, который я хотел. Дал мне какой-то странный IllegalSTateException ...
То, что я думал, что будет работать лучше, и на самом деле очень хотел работать плохо: Вместо добавления фрагментов с:
private final List<Fragment> mFragments = new ArrayList<Fragment>(); public void addFragment(Fragment fragment) { mFragments.add(fragment); notifyDataSetChanged(); }
использовать
mFragments.add(0, fragment);
Но это дает IllegalStateException с сообщением :
Can't change tag of fragment ChatFragment
Когда я пытаюсь добавить временный фрагмент. Теперь два вопроса:
Есть ли способ обойти эту вкладку фрагмент, я могу забрать все теги фрагмента на минуту и восстановить их все или что-то? Или
Есть ли лучший и элегантный способ сделать это? Или я должен просто изменить свой интерфейс, чтобы вкладка могла использоваться справа? : P
EDIT: Вот некоторые код: (Я никогда не хочу просто оставить стену смерти людей, потому что это может отпугнуть их: о)
FragmentPagerAdapter:
public class PagerAdapter extends FragmentPagerAdapter {
private Context mContext;
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
mContext = context;
}
private final List<Fragment> mFragments = new ArrayList<Fragment>();
public void addFragment(Fragment fragment) {
mFragments.add(fragment);
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public String getPageTitle(int position) {
switch (position) {
case 0:
return mContext.getString(R.string.tab_title_chats);
case 1:
return mContext.getString(R.string.tab_title_contacts);
case 2:
return mContext.getString(R.string.tab_title_create);
}
return "WOOPS";
}
}
MainActivty :
public class LaunchActivity extends FragmentActivity implements ActionBar.TabListener {
private PagerAdapter mAdapter;
private FragmentManager man;
private ViewPager mViewPager;
private ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_container);
// Set up the action bar.
actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Layout stuff
mViewPager = (ViewPager) findViewById(R.id.masterViewPager);
// Creating the mAdapter and initializing the mViewPager
man = getSupportFragmentManager();
mAdapter = new PagerAdapter(man, getApplicationContext());
mViewPager.setAdapter(mAdapter);
for (int i = 0; i < 2; i++) {
makeFragments(i);
System.out.println("Baking tasty fragment instances...nom nom nom");
}
// Called when tab changes
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < mAdapter.getCount(); i++) {
System.out.println("Working...");
actionBar.addTab(actionBar.newTab().setText(mAdapter.getPageTitle(i)).setTabListener(this));
}
}
// Add fragment instances to ArrayList depending on their future position on the ActionBar
private void makeFragments(int i) {
if (i == 0) {
mAdapter.addFragment(ChatFragment.getInstance());
}
else if (i == 1) {
mAdapter.addFragment(ContactFragment.getInstance());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout_container, menu);
return true;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(tab.getPosition());
}
public void addTab(int i) {
mAdapter.addFragment(ComposeFragment.getInstance());
System.out.println("Created new Fragment, now adding it as a tab");
actionBar.addTab(actionBar.newTab().setText(mAdapter.getPageTitle(i)).setTabListener(this));
System.out.println("Added it as a tab. Hurray");
}
/** IGNORE BELOW **/
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
StackTrace:
03-18 18:32:29.274: E/AndroidRuntime(26435): FATAL EXCEPTION: main
03-18 18:32:29.274: E/AndroidRuntime(26435): java.lang.IllegalStateException: Can't change tag of fragment ChatFragment{41492428 #1 id=0x7f070004 android:switcher:2131165188:1}: was android:switcher:2131165188:1 now android:switcher:2131165188:2
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:389)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:801)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.populate(ViewPager.java:992)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:523)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:495)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:875)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2690)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.package.subpackage.components.PagerAdapter.addFragment(PagerAdapter.java:25)
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.package.subpackage.someapp.core.LaunchActivity.addTab(LaunchActivity.java:116)
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.
com.package.subpackage.fragments.full.ChatFragment$1.onClick(ChatFragment.java:51)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.view.View.performClick(View.java:4204)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.view.View$PerformClick.run(View.java:17355)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Handler.handleCallback(Handler.java:725)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Handler.dispatchMessage(Handler.java:92)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Looper.loop(Looper.java:137)
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-18 18:32:29.274: E/AndroidRuntime(26435): at java.lang.reflect.Method.invokeNative(Native Method)
03-18 18:32:29.274: E/AndroidRuntime(26435): at java.lang.reflect.Method.invoke(Method.java:511)
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-18 18:32:29.274: E/AndroidRuntime(26435): at dalvik.system.NativeStart.main(Native Method)
размещать весь свой код и, если возможно, пост весь трассировки стека – Triode
Готово. Добавлена MainActivity (которая содержит все управление вкладками), а PagerAdapter – AreusAstarte
в функции addFragment меняет эту строку кода на mFragments.add (фрагмент); к mFragments.add (0, фрагмент); это. – Triode