Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “操作栏”选项卡必须具有回调_Android_Layout_Android Fragments_Android Actionbar_Illegalstateexception - Fatal编程技术网

Android “操作栏”选项卡必须具有回调

Android “操作栏”选项卡必须具有回调,android,layout,android-fragments,android-actionbar,illegalstateexception,Android,Layout,Android Fragments,Android Actionbar,Illegalstateexception,我正在尝试在我的应用程序中实现ActionBar。我的代码很好,但当我尝试加载项目时,会出现以下错误: 原因:java.lang.IllegalStateException:操作栏选项卡必须具有 回调,并强制关闭 如何实现回拨 import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.Activity; import android.app.Fragment; import android

我正在尝试在我的应用程序中实现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
        }
    }
}
导入android.app.ActionBar;
导入android.app.ActionBar.Tab;
导入android.app.Activity;
导入android.app.Fragment;
导入android.app.FragmentTransaction;
导入android.os.Bundle;
公共类MainResource扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最终ActionBar ActionBar=getActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
Tab tabA=actionBar.newTab();
表A.setText(“表A”);
tabA.setTabListener(新的TabListener(这个“标记A”,Categories.class));
actionBar.addTab(tabA);
Tab tabB=actionBar.newTab();
表B.setText(“表B”);
tabB.setTabListener(新的TabListener(这个“标签B”,favorites.class));
actionBar.addTab(tabB);
Tab tabC=actionBar.newTab();
表C.setText(“表C”);
tabC.setTabListener(新的TabListener(这个“tagc”,ThisWeek.class));
actionBar.addTab(tabC);
Tab tabD=actionBar.newTab();
表C.setText(“表D”);
tabC.setTabListener(新的TabListener(这个“Tag D”,Estore.class));
actionBar.addTab(tabD);
如果(savedInstanceState!=null){
int savedIndex=savedInstanceState.getInt(“保存的索引”);
getActionBar().setSelectedNavigationItem(savedIndex);
}
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
//TODO自动生成的方法存根
super.onSaveInstanceState(超出状态);
putInt(“保存的索引”,getActionBar().getSelectedNavigationIndex());
}
公共静态类TablListener实现ActionBar.TablListener{
私人最终活动;
私有最终字符串myTag;
私人期末班myClass;
公共TabListener(活动、字符串标记、类cls){
我的活动=活动;
myTag=tag;
myClass=cls;
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
Fragment myFragment=myActivity.getFragmentManager().findFragmentByTag(myTag);
//检查片段是否已初始化
if(myFragment==null){
//如果不是,则实例化并将其添加到活动中
myFragment=Fragment.instantiate(myActivity,myClass.getName());
ft.add(android.R.id.content、myFragment、myTag);
}否则{
//如果存在,只需将其附加以显示即可
ft.attach(myFragment);
}
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
Fragment myFragment=myActivity.getFragmentManager().findFragmentByTag(myTag);
if(myFragment!=null){
//拆下碎片,因为正在连接另一个碎片
ft.detach(myFragment);
}
}
@凌驾
已重新选择公共无效页签(页签,碎片事务){
//TODO自动生成的方法存根
}
}
}
您正在将“this”(当前活动对象)设置为侦听器:

tabA.setTabListener(new TabListener<Categories>(this, "Tag A", Categories.class));
tabA.setTabListener(新的TabListener(这个“标记A”,Categories.class));
要成为一个监听器,活动应该实现适当的接口。 因此:

  • 以以下方式声明您的活动:
公共类MainResource扩展活动实现TablListener
  • 在活动中实现TablListener接口的方法(您的IDE将通过建议“实现方法…”来帮助您)

也许您的代码还存在一些问题,但您确实需要指定一个正确的对象作为TabListener。

Tab tabD=actionBar.newTab()

tabC.setText(“Tab D”);
tabC.setTabListener(新的TabListener(这个“Tag D”,Estore.class));

将tabC更改为tabD,问题就会解决。

你能发布一些代码吗?错误发生在哪一行?@Al它在任何一行上都不显示错误,但当我运行它时,它会强制关闭,这将错误显示在TabListener构造函数上,它将活动对象作为第一个参数,因此
这是可以的。好的,如果它对您不起作用,我将发布整个代码片段,这对我来说很好
public class MainResource extends Activity implements TabListener
    tabC.setText("Tab D");

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