操作栏标签必须有一个回调 [英] Action Bar Tab must have a Callback
问题描述
我想实现我的应用程序的动作条。我的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屋!