Android工作室actionBar与Tabs

时间:2015-02-12 15:35:11

标签: android android-actionbar

我只是想创建一个包含3个标签的简单应用程序,以便我可以开始关注actionBar标签和片段。我一直在关注这个教程http://www.androidbegin.com/tutorial/implementing-fragment-tabs-in-android/“但是当我在我的连接设备(4.4.4)上运行它时,它只是在启动时崩溃。我的minSDK是19,编译SDK是21.唯一不同的东西在链接中的代码和我的代码之间是包名称是不同的,所以链接中的代码就是我正在使用的。任何关于为什么应用程序在启动时不断崩溃的帮助都会非常苛刻,谢谢!

logcat的

 02-12 15:21:46.678  13813-13813/com.androidbegin.absfragtabhost E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.androidbegin.absfragtabhost, PID: 13813
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidbegin.absfragtabhost/com.androidbegin.absfragtabhost.MainActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
        at android.app.ActivityThread.access$800(ActivityThread.java:139)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5086)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.androidbegin.absfragtabhost.MainActivity.onCreate(MainActivity.java:23)
        at android.app.Activity.performCreate(Activity.java:5248)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
        at android.app.ActivityThread.access$800(ActivityThread.java:139)
          atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5086)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
 atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
       at dalvik.system.NativeStart.main(Native Method)

修改     MainActivity(与链接中的相同)

package com.androidbegin.absfragtabhost;

import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {
// Declare Tab Variable
ActionBar.Tab Tab1, Tab2, Tab3;
Fragment fragmentTab1 = new FragmentTab1();
Fragment fragmentTab2 = new FragmentTab2();
Fragment fragmentTab3 = new FragmentTab3();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar actionBar = getActionBar();

    // Hide Actionbar Icon
    actionBar.setDisplayShowHomeEnabled(false);

    // Hide Actionbar Title
    actionBar.setDisplayShowTitleEnabled(false);

    // Create Actionbar Tabs
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Set Tab Icon and Titles
    Tab1 = actionBar.newTab().setIcon(R.drawable.tab1);
    Tab2 = actionBar.newTab().setText("Tab2");
    Tab3 = actionBar.newTab().setText("Tab3");

    // Set Tab Listeners
    Tab1.setTabListener(new TabListener(fragmentTab1));
    Tab2.setTabListener(new TabListener(fragmentTab2));
    Tab3.setTabListener(new TabListener(fragmentTab3));

    // Add tabs to actionbar
    actionBar.addTab(Tab1);
    actionBar.addTab(Tab2);
    actionBar.addTab(Tab3);
 }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

Android清单xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidbegin.absfragtabhost" >

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  </application>

</manifest>

2 个答案:

答案 0 :(得分:1)

如果你想使用ActionBar,你应该从ActionBarActivity扩展你的活动,因为通常的活动没有任何ActionBar。

您还可以将新的Google工具栏添加到您的版面,然后通过

获取
Toolbar toolbar = findViewById(R.id.toolbar);

然后按

设置
setActionBar(toolbar);

之后应该可以使用getActionBar调用等。

希望它有助于欢呼;)

答案 1 :(得分:1)

所以我自己运行了这个项目。如果您的基本活动来自Theme.AppCompatActionBarActivity只会生成一个ActionBar。在styles.xml中使用@android:style/Theme.Holo.Light.DarkActionBar而不是Theme.AppCompat来默认生成操作栏。

错误是由getActionBar()返回null时尝试调用ActionBar方法引起的。您链接的教程没有显示styles.xml(也是一个非常过时的教程!)