android 中关于在 ActionBar 上包含 SwipedTabs 的问题
Issue on including SwipedTabs on ActionBar in android
我只想在屏幕上包含 SwipedTabs。所以我在没有像这样的 TabListeners 的情况下编写代码,
`
package com.example.swipetabexample;
import android.app.ActionBar;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity
{
ActionBar ab;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ab = getActionBar();
ActionBar.Tab at= ab.newTab();
at.setText("Tab1");
ab.addTab(at);
}
}
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_height="match_parent"
android:layout_width="match_parent">
</android.support.v4.view.ViewPager>`
当我 运行 这段代码时,我总是 error.But 我检查了一遍又一遍,但我找不到问题所在。我发现很多博客他们也像这样实现了滑动标签,但带有带有 TabListener 的片段。
但首先,我只想在屏幕上看到选项卡。
这里我给出了Logcat
所示的错误
01-20 14:52:12.264: E/AndroidRuntime(1233): FATAL EXCEPTION: main
01-20 14:52:12.264: E/AndroidRuntime(1233): 进程: com.example.swipetabexample, PID: 1233
01-20 14:52:12.264: E/AndroidRuntime(1233): java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.swipetabexample/com.example.swipetabexample.MainActivity}: java.lang.IllegalStateException: 操作栏选项卡必须有一个回调
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.access$800(ActivityThread.java:135)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.os.Handler.dispatchMessage(Handler.java:102)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.os.Looper.loop(Looper.java:136)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.main(ActivityThread.java:5017)
01-20 14:52:12.264:E/AndroidRuntime(1233):在 java.lang.reflect.Method.invokeNative(本机方法)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 java.lang.reflect.Method.invoke(Method.java:515)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 dalvik.system.NativeStart.main(本机方法)
01-20 14:52:12.264: E/AndroidRuntime(1233): Caused by: java.lang.IllegalStateException: Action Bar Tab 必须有回调
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.configureTab(ActionBarImpl.java:478)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:504)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:492)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.example.swipetabexample.MainActivity.onCreate(MainActivity.java:25)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.Activity.performCreate(Activity.java:5231)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
01-20 14:52:12.264: E/AndroidRuntime(1233): ... 11 更多
01-20 16:59:43.564: D/dalvikvm(1368): GC_FOR_ALLOC 释放 77K,5% 释放 3415K/3568K,暂停 26ms,总计 26ms
01-20 16:59:43.572: D/dalvikvm(1368): GC_FOR_ALLOC 释放 3K,5% 释放 3633K/3792K,暂停 2ms,总计 5ms
01-20 16:59:43.592:I/dalvikvm-heap(1368):将堆(碎片情况)增加到 6.039MB,分配 2536932 字节
01-20 16:59:43.600: D/dalvikvm(1368): GC_FOR_ALLOC 释放 <1K,3% 释放 6111K/6272K,暂停 8ms,总计 8ms
01-20 16:59:43.664: D/AndroidRuntime(1368): 关闭虚拟机
01-20 16:59:43.668: W/dalvikvm(1368): threadid=1: 线程退出并出现未捕获的异常 (group=0xa4ce3b20)
01-20 16:59:43.668: E/AndroidRuntime(1368): 致命异常: main
01-20 16:59:43.668: E/AndroidRuntime(1368): 过程: com.example.swipetabexample, PID: 1368
01-20 16:59:43.668: E/AndroidRuntime(1368): java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.swipetabexample/com.example.swipetabexample.MainActivity}: java.lang.IllegalStateException: 操作栏选项卡必须有一个回调
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.access$800(ActivityThread.java:135)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.os.Handler.dispatchMessage(Handler.java:102)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.os.Looper.loop(Looper.java:136)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.main(ActivityThread.java:5017)
01-20 16:59:43.668:E/AndroidRuntime(1368):在 java.lang.reflect.Method.invokeNative(本机方法)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 java.lang.reflect.Method.invoke(Method.java:515)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 dalvik.system.NativeStart.main(本机方法)
01-20 16:59:43.668: E/AndroidRuntime(1368): Caused by: java.lang.IllegalStateException: Action Bar Tab 必须有回调
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.configureTab(ActionBarImpl.java:478)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:504)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:492)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.example.swipetabexample.MainActivity.onCreate(MainActivity.java:23)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.Activity.performCreate(Activity.java:5231)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
01-20 16:59:43.668: E/AndroidRuntime(1368): ... 11 更多
请在创建时添加以下代码
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Create a tab listener that is called when the user changes tabs.
ActionBar.TabListener tabListener = new ActionBar.TabListener() {
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// show the given tab
}
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
// hide the given tab
}
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
// probably ignore this event
}
};
ab = getActionBar();
ActionBar.Tab at= ab.newTab();
at.setText("Tab1");
ab.addTab(at).setTabListener(tabListener);
最后我通过 Eclipse Bydefault 代码生成器得到了相同的代码。通过选择选项 TabActivity 而不是选择 BlankActivity。
我只想在屏幕上包含 SwipedTabs。所以我在没有像这样的 TabListeners 的情况下编写代码,
`
package com.example.swipetabexample;
import android.app.ActionBar;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity
{
ActionBar ab;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ab = getActionBar();
ActionBar.Tab at= ab.newTab();
at.setText("Tab1");
ab.addTab(at);
}
}
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_height="match_parent"
android:layout_width="match_parent">
</android.support.v4.view.ViewPager>`
当我 运行 这段代码时,我总是 error.But 我检查了一遍又一遍,但我找不到问题所在。我发现很多博客他们也像这样实现了滑动标签,但带有带有 TabListener 的片段。 但首先,我只想在屏幕上看到选项卡。 这里我给出了Logcat
所示的错误01-20 14:52:12.264: E/AndroidRuntime(1233): FATAL EXCEPTION: main
01-20 14:52:12.264: E/AndroidRuntime(1233): 进程: com.example.swipetabexample, PID: 1233 01-20 14:52:12.264: E/AndroidRuntime(1233): java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.swipetabexample/com.example.swipetabexample.MainActivity}: java.lang.IllegalStateException: 操作栏选项卡必须有一个回调 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.access$800(ActivityThread.java:135) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.os.Handler.dispatchMessage(Handler.java:102) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.os.Looper.loop(Looper.java:136) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.main(ActivityThread.java:5017) 01-20 14:52:12.264:E/AndroidRuntime(1233):在 java.lang.reflect.Method.invokeNative(本机方法) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 java.lang.reflect.Method.invoke(Method.java:515) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 dalvik.system.NativeStart.main(本机方法) 01-20 14:52:12.264: E/AndroidRuntime(1233): Caused by: java.lang.IllegalStateException: Action Bar Tab 必须有回调 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.configureTab(ActionBarImpl.java:478) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:504) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:492) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 com.example.swipetabexample.MainActivity.onCreate(MainActivity.java:25) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.Activity.performCreate(Activity.java:5231) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 01-20 14:52:12.264: E/AndroidRuntime(1233): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 01-20 14:52:12.264: E/AndroidRuntime(1233): ... 11 更多 01-20 16:59:43.564: D/dalvikvm(1368): GC_FOR_ALLOC 释放 77K,5% 释放 3415K/3568K,暂停 26ms,总计 26ms 01-20 16:59:43.572: D/dalvikvm(1368): GC_FOR_ALLOC 释放 3K,5% 释放 3633K/3792K,暂停 2ms,总计 5ms 01-20 16:59:43.592:I/dalvikvm-heap(1368):将堆(碎片情况)增加到 6.039MB,分配 2536932 字节 01-20 16:59:43.600: D/dalvikvm(1368): GC_FOR_ALLOC 释放 <1K,3% 释放 6111K/6272K,暂停 8ms,总计 8ms 01-20 16:59:43.664: D/AndroidRuntime(1368): 关闭虚拟机 01-20 16:59:43.668: W/dalvikvm(1368): threadid=1: 线程退出并出现未捕获的异常 (group=0xa4ce3b20) 01-20 16:59:43.668: E/AndroidRuntime(1368): 致命异常: main 01-20 16:59:43.668: E/AndroidRuntime(1368): 过程: com.example.swipetabexample, PID: 1368 01-20 16:59:43.668: E/AndroidRuntime(1368): java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.swipetabexample/com.example.swipetabexample.MainActivity}: java.lang.IllegalStateException: 操作栏选项卡必须有一个回调 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.access$800(ActivityThread.java:135) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.os.Handler.dispatchMessage(Handler.java:102) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.os.Looper.loop(Looper.java:136) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.main(ActivityThread.java:5017) 01-20 16:59:43.668:E/AndroidRuntime(1368):在 java.lang.reflect.Method.invokeNative(本机方法) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 java.lang.reflect.Method.invoke(Method.java:515) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 dalvik.system.NativeStart.main(本机方法) 01-20 16:59:43.668: E/AndroidRuntime(1368): Caused by: java.lang.IllegalStateException: Action Bar Tab 必须有回调 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.configureTab(ActionBarImpl.java:478) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:504) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.android.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:492) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 com.example.swipetabexample.MainActivity.onCreate(MainActivity.java:23) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.Activity.performCreate(Activity.java:5231) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 01-20 16:59:43.668: E/AndroidRuntime(1368): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 01-20 16:59:43.668: E/AndroidRuntime(1368): ... 11 更多
请在创建时添加以下代码
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Create a tab listener that is called when the user changes tabs.
ActionBar.TabListener tabListener = new ActionBar.TabListener() {
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// show the given tab
}
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
// hide the given tab
}
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
// probably ignore this event
}
};
ab = getActionBar();
ActionBar.Tab at= ab.newTab();
at.setText("Tab1");
ab.addTab(at).setTabListener(tabListener);
最后我通过 Eclipse Bydefault 代码生成器得到了相同的代码。通过选择选项 TabActivity 而不是选择 BlankActivity。