操作栏标签必须有一个回调 [英] Action Bar Tab must have a Callback

查看:190
本文介绍了操作栏标签必须有一个回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现我的应用程序的动作条。我的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));
 

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

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

    公共类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.

这篇关于操作栏标签必须有一个回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆