3

アプリケーションに ActionBar を実装しようとしています。私のコードは問題ありませんが、プロジェクトを読み込もうとすると、次のエラーが表示されます。

原因: java.lang.IllegalStateException: アクション バー タブにはコールバックが必要であり、強制終了

コールバックを実装するにはどうすればよいですか?

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class MainResource extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        Tab tabA = actionBar.newTab();
        tabA.setText("Tab A");
        tabA.setTabListener(new TabListener<Categories>(this, "Tag A", Categories.class));
        actionBar.addTab(tabA);

        Tab tabB = actionBar.newTab();
        tabB.setText("Tab B");
        tabB.setTabListener(new TabListener<Favourites>(this, "Tag B", Favourites.class));
        actionBar.addTab(tabB);

        Tab tabC = actionBar.newTab();
        tabC.setText("Tab C");
        tabC.setTabListener(new TabListener<ThisWeek>(this, "Tag C", ThisWeek.class));
        actionBar.addTab(tabC);

        Tab tabD = actionBar.newTab();
        tabC.setText("Tab D");
        tabC.setTabListener(new TabListener<Estore>(this, "Tag D", Estore.class));
        actionBar.addTab(tabD);


        if (savedInstanceState != null) {
            int savedIndex = savedInstanceState.getInt("SAVED_INDEX");
            getActionBar().setSelectedNavigationItem(savedIndex);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        outState.putInt("SAVED_INDEX", getActionBar().getSelectedNavigationIndex());
    }


    public static class TabListener<T extends Fragment> implements ActionBar.TabListener{
        private final Activity myActivity;
        private final String myTag;
        private final Class<T> myClass;


        public TabListener(Activity activity, String tag, Class<T> cls) {
            myActivity = activity;
            myTag = tag;
            myClass = cls;
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {

            Fragment myFragment = myActivity.getFragmentManager().findFragmentByTag(myTag);

           // Check if the fragment is already initialized
           if (myFragment == null) {
               // If not, instantiate and add it to the activity
               myFragment = Fragment.instantiate(myActivity, myClass.getName());
               ft.add(android.R.id.content, myFragment, myTag);
           } else {
               // If it exists, simply attach it in order to show it
               ft.attach(myFragment);
           }
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            Fragment myFragment = myActivity.getFragmentManager().findFragmentByTag(myTag);
            if (myFragment != null) {
                // Detach the fragment, because another one is being attached
            ft.detach(myFragment);
            }
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
    }
}
4

2 に答える 2

1

「this」(現在のアクティビティ オブジェクト) をリスナーとして設定しています。

tabA.setTabListener(new TabListener<Categories>(this, "Tag A", Categories.class));

リスナーになるには、アクティビティは適切なインターフェースを実装する必要があります。そう:

  • この方法でアクティビティを宣言します。
    public class MainResource extends Activity 実装 TabListener
  • アクティビティで TabListener インターフェイスのメソッドを実装します (IDE は「メソッドの実装...」をアドバイスすることで役立ちます)。

コードにさらに問題がある可能性がありますが、正しいオブジェクトを TabListener として確実に割り当てる必要があります。

于 2013-03-05T19:49:36.273 に答える
0

タブ tabD = actionBar.newTab();

    tabC.setText("Tab D");

    tabC.setTabListener(new TabListener<Estore>(this, "Tag D", Estore.class));

tabC を tabD に変更すると、問題は解決します。

于 2014-01-31T14:57:51.967 に答える