이것은 내가 탭에 대해 가지고있는 마지막 질문입니다. :) (아마도) 이전 질문과 시도에서 오류가 발생 했으므로 몇 가지 탭을 만들고 또한 PagerAdapter라는 오류 메시지가 나타납니다. 새로운 탭을 동적으로 생성하는 기능. 문제는 새로운 탭이 항상 기존 탭의 오른쪽에 삽입 얻을 것입니다 :FragmentPagerAdapter를 사용하여 왼쪽에 탭 추가
는(그림 :
은 "정적 항목을 추가
나는 다음 시도 null "탭의 초기 세트를 만들 때 건너 뛸 것입니다. 나중에"Temp Tab "을 만들 때 원하는 항목을 무시할 수 있습니다.것은 내가 가장 적합한 것이라고 생각하고 실제로 정말 심하게 일을하고 싶었 대신에 조각을 추가하는 :
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
언제 임시 조각을 추가하려고합니까? 이제 두 가지 질문 : 나는 잠시 떨어져 모든 조각 태그를 가지고 그들 전부 또는 일을 다시 할 수
는 조각 탭 주위에 방법이 있나요? 또는
이렇게하는 것이 훨씬 쉽고 우아한 방법이 있습니까? 아니면 탭을 오른쪽으로 사용할 수 있도록 UI를 다시 디자인해야합니까? : P
편집 : 여기에 몇 가지 코드는 : (이 그들을 놀라게 수 있기 때문에 나는 싶지는 사람들에게 죽음의 벽을 게시하지 : O를)
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) {
}
}
스택 트레이스 :
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를 추가하고 addFragment 함수의 PagerAdapter – AreusAstarte
이이 코드 줄을 mFragments.add (조각)로 변경합니다. ~ mFragments.add (0, fragment); 이. – Triode