操作栏标签必须有一个回调回调、有一个、操作、标签

2023-09-13 23:38:18 作者:囍妹儿.

我想实现我的应用程序的动作条。我的code是正常,但当我尝试加载它给了我这个错误的项目:

  

产生的原因:java.lang.IllegalStateException:操作栏标签必须有一个   回调,并强制关闭

我如何实现一个回调?

 进口android.app.ActionBar;
进口android.app.ActionBar.Tab;
进口android.app.Activity;
进口android.app.Fragment;
进口android.app.FragmentTransaction;
进口android.os.Bundle;

公共类MainResource延伸活动{

    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

        最后的动作条动作条= getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        标签塔巴= actionBar.newTab();
        tabA.setText(选项卡);
        tabA.setTabListener(新TabListener<类别>(这一点,变量A,Categories.class));
        actionBar.addTab(塔巴);

        标签塔布= actionBar.newTab();
        tabB.setText(标签B);
        tabB.setTabListener(新TabListener<最>(这一点,标记B,Favourites.class));
        actionBar.addTab(塔布);

        标签TABC = actionBar.newTab();
        tabC.setText(选项卡C);
        tabC.setTabListener(新TabListener< ThisWeek>(这一点,标签C,ThisWeek.class));
        actionBar.addTab(TABC);

        标签TABD = actionBar.newTab();
        tabC.setText(选项卡D);
        tabC.setTabListener(新TabListener<网上商店>(这一点,标签D,Estore.class));
        actionBar.addTab(TABD);


        如果(savedInstanceState!= NULL){
            INT savedIndex = savedInstanceState.getInt(SAVED_INDEX);
            。getActionBar()setSelectedNavigationItem(savedIndex);
        }
    }

    @覆盖
    保护无效的onSaveInstanceState(包outState){
        // TODO自动生成方法存根
        super.onSaveInstanceState(outState);
        outState.putInt(SAVED_INDEX,getActionBar()getSelectedNavigationIndex());
    }


    公共静态类TabListener<吨延伸片断>实现ActionBar.TabListener {
        私人最终活动myActivity;
        私人最终字符串MyTag的;
        私人最终类别< T>我班;


        公共TabListener(活动活动,字符串变量,类< T>的cls){
            myActivity =活动;
            MyTag的=标签;
            MyClass的= CLS;
        }

        @覆盖
        公共无效onTabSelected(TAB键,FragmentTransaction英尺){

            片段myFragment = myActivity.getFragmentManager()findFragmentByTag(MyTag的)。

           //检查片段已初始化
           如果(myFragment == NULL){
               //如果没有,实例化并把它添加到活动
               myFragment = Fragment.instantiate(myActivity,myClass.getName());
               ft.add(android.R.id.content,myFragment,MyTag的);
           } 其他 {
               //如果它存在,只需将它为了显示它
               ft.attach(myFragment);
           }
        }

        @覆盖
        公共无效onTabUnselected(TAB键,FragmentTransaction英尺){
            片段myFragment = myActivity.getFragmentManager()findFragmentByTag(MyTag的)。
            如果(myFragment!= NULL){
                //分离的片段,因为另一个被连接
            ft.detach(myFragment);
            }
        }

        @覆盖
        公共无效onTabReselected(TAB键,FragmentTransaction英尺){
            // TODO自动生成方法存根
        }
    }
}
 

解决方案

您正在设置本(当前活动的对象)作为侦听器:

  tabA.setTabListener(新TabListener<类别>(这一点,变量A,Categories.class));
 
重磅 周一散户吐血现象不会发生,注意11 20减仓

要做个倾听者,活动应实施适当的接口。 所以:

在声明你的活动是这样的:

    公共类MainResource扩展活动实现TabListener

实施TabListener界面的活性的方法(你的IDE会帮助你通过建议实现方法...)

也许有一些问题,你的code,但你需要一个合适的对象指定为TabListener肯定的。

I'm trying to implement an ActionBar in my application. My code is fine but when I try to load the project it gives me this error :

Caused by: java.lang.IllegalStateException: Action Bar Tab must have a Callback, and forces closure

How can I implement a call back?

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
        }
    }
}

解决方案

You're setting "this" (current activity object) as a listener:

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

To be a listener, activity should implement proper interface. So:

Declare your activity in this way:

    public class MainResource extends Activity implements TabListener

Implement methods of TabListener interface in activity (your IDE will help you by advising "implement methods...")

Maybe there are some more issues with your code, but You need to assign a right object as a TabListener for sure.