6

これは、タブに関する最後の質問になります。約束します:) (多分)以前の質問と試行錯誤から、いくつかのタブを作成し、新しいタブを動的に作成する機能を提供する PagerAdapter と呼ばれる FragmentPagerAdapter があります。問題は、新しいタブが常に既存のタブの右側に挿入されることです:

(写真:http://s7.directupload.net/file/d/3198/73dyzvzv_png.htm

私は次のことを試しました:

  1. タブの最初のセットを作成するときにスキップされる「null」の静的エントリを追加します。その後、「一時タブ」を作成するときに、そのエントリを必要なフラグメントにオーバーライドできました。奇妙な IllegalSTateException が発生しました...

  2. 私が最高にうまくいくと思っていたものと、実際には本当にうまくいかなかったこと: フラグメントを追加する代わりに:

    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

一時フラグメントを追加しようとすると。さて、2つの質問:

  1. そのフラグメント タブを回避する方法はありますか? すべてのフラグメント タグを一時的に削除して、すべてまたは何かを再構築できますか? または

  2. これを行うためのはるかに優れたエレガントな方法はありますか? それとも、タブを右側で使用できるように 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";

  }

}

メインアクティビティ:

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)
4

1 に答える 1

0

これは、OnPageChangeListener の onPageSelected メソッドをオーバーライドすることで実現できました。A<->B<->C の順序で 3 つのページがあるとします。目標は、A から右にスクロールすると C に到達し、C から左にスクロールすると同様に A に到達することです。

これを行うには、5 ページ (3+2) を持つように定義し、次のようにページを編成します。

C<->A<->B<->C<->A

onPageSelected メソッドで確認し、位置が 0 の場合は 3 (getCount()-2) に変更し、位置が 4 (getCount()-1) の場合は 1 に変更します。 .

ありがとう

于 2013-05-11T13:05:26.377 に答える