0

新しいバージョンのアプリケーション内でActionBarSherlockとTabViewPagerを使用しており、特定のタブがアクティブな場合にのみ特定のコードを実行しようとしています。まず、TabHostを設定し、それにフラグメントを追加する方法を紹介します。

 private void intialiseViewPager() {

    List<Fragment> fragments = new Vector<Fragment>();
    fragments.add(Fragment.instantiate(this, TabFragment1.class.getName()));
    fragments.add(Fragment.instantiate(this, TabFragment2.class.getName()));
    if (appVersionV3()) {
        fragments.add(Fragment.instantiate(this, TabFragment3.class.getName()));
    }

    this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(), fragments);
    //
    this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);
    this.mViewPager.setAdapter(this.mPagerAdapter);
    this.mViewPager.setOnPageChangeListener(this);
}

/**
 * Initialise the Tab Host
 */
private void initialiseTabHost(Bundle args) {
    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();
    TabInfo tabInfo = null;
    TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab1").setIndicator("Calculator"), ( tabInfo = new TabInfo("Calculator", TabFragment1.class, args)));
    this.mapTabInfo.put(tabInfo.tag, tabInfo);

    TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab2").setIndicator("Tracker"), ( tabInfo = new TabInfo("Tracker", TabFragment2.class, args)));
    this.mapTabInfo.put(tabInfo.tag, tabInfo);

    if (appVersionV3()) {
        TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab3").setIndicator("Food List"), ( tabInfo = new TabInfo("FoodList", TabFragment3.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);
    }

    // Default to first tab
    //this.onTabChanged("Tab1");
    //
    mTabHost.setOnTabChangedListener(this);

}

private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {
    // Attach a Tab view factory to the spec
    tabSpec.setContent(activity.new TabFactory(activity));
    tabHost.addTab(tabSpec);
}

私の最初の考えは、Activity onTabChangedからフラグメントのメソッドを呼び出すことでしたが、機能しません。以下の私の試みを参照してください-それが行うのはアプリを強制終了することだけです。必要に応じて、このクラッシュのログを取得できます。

    public void onTabChanged(String tag) {
    //TabInfo newTab = this.mapTabInfo.get(tag);
    int pos = this.mTabHost.getCurrentTab();
    mTabHost.getCurrentTabView().invalidate();

    this.mViewPager.setCurrentItem(pos);

    if (pos == 1) {
        TabFragment2 tabFragment = (TabFragment2) getSupportFragmentManager().findFragmentByTag("Tracker");

tabFragment.calculatePoints();
        }
    }

また、メインアクティビティが開始されるとすぐにフラグメントのonResumeが呼び出されるため、その中のフラグメント固有のコードを呼び出して変更を検出することはできません。

私の他の唯一の考えは使用することonResumeFragments()でしたが、それはタイプに対して定義されていないようですSherlockFragment-それがActionBarSherlockの障害のエラーであるかどうか、またはそれが想定されている方法であるかどうかはわかりません。

どんな助けでも大歓迎です!

4

1 に答える 1

0

誰かが私のフラグメントがリストにあるので、リストから必要なフラグメントを取得するだけだと言いました。リスト/ベクターをグローバルに初期化した後、リストからフラグメントを取得し、タブの変更時に必要に応じてそれぞれの関数を呼び出すことができました。これは魅力のように機能します。

public void onTabChanged(String tag) {
    //TabInfo newTab = this.mapTabInfo.get(tag);
    int pos = this.mTabHost.getCurrentTab();
    mTabHost.getCurrentTabView().invalidate();
    this.mViewPager.setCurrentItem(pos);

    // calculatePoints on TabChange
    if (pos == 1) {
        TabFragment2 fragTrack = (TabFragment2) fragments.get(1);
        fragTrack.calculatePoints();
        fragTrack.createAndFillDatabase();
    }

    else if (pos ==2) {
        TabFragment3 fragFoodList = (TabFragment3) fragments.get(2);
        fragFoodList.createAndFillDatabase("none");
    }

    this.supportInvalidateOptionsMenu();
}
于 2012-12-23T15:23:43.517 に答える