简体   繁体   English

Android FragmentActivity在getActionBar()中返回null

[英]Android FragmentActivity returns null in getActionBar()

I have imported an Android sample project called HorizontalPaging in Android Studio and it works fine when I run it. 我在Android Studio中导入了一个名为Horizo​​ntalPaging的Android示例项目,运行时它可以正常工作。 But when I copied the code into my code, I get a NULL pointer exception in getActionBar() . 但是当我将代码复制到我的代码中时, 我在getActionBar()中得到一个NULL指针异常

I have been reading about these problems the whole day but can't get it working. 我一整天都在阅读这些问题,但无法让它发挥作用。 Tried copying the entire code from the sample's MainActivity into my project but no improvements so I am guessing that the problem is in some other file like manifest,styles,etc. 尝试将样本的MainActivity中的整个代码复制到我的项目中但没有改进,所以我猜测问题出现在其他文件中,如清单,样式等。

MainActivity.java copied from the sample project 从示例项目中复制MainActivity.java

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Locale;


public class View_Tabs extends FragmentActivity implements ActionBar.TabListener {


SectionsPagerAdapter mSectionsPagerAdapter;


ViewPager mViewPager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Load the UI from res/layout/activity_main.xml
    setContentView(R.layout.view_tabs);


    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


    // Create the adapter that will return a fragment for each of the three primary sections
    // of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    // When swiping between different sections, select the corresponding tab. We can also use
    // ActionBar.Tab#select() to do this if we have a reference to the Tab.

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });



    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        // Create a tab with text corresponding to the page title defined by the adapter. Also
        // specify this Activity object, which implements the TabListener interface, as the
        // callback (listener) for when this tab is selected.
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                        .setTabListener(this));
    }

}


@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, tell the ViewPager to switch to the corresponding page.
    mViewPager.setCurrentItem(tab.getPosition());
}



@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}


@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}


public class SectionsPagerAdapter extends FragmentPagerAdapter {


    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }



    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment = new DummySectionFragment();
        Bundle args = new Bundle();
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }


    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return getString(R.string.tab_list).toUpperCase(l);
            case 1:
                return getString(R.string.tab_map).toUpperCase(l);
            case 2:
                return getString(R.string.tab_list).toUpperCase(l);
        }
        return null;
    }

}

/**
 * A dummy fragment representing a section of the app, but that simply displays dummy text.
 * This would be replaced with your application's content.
 */
public static class DummySectionFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    public static final String ARG_SECTION_NUMBER = "section_number";

    public DummySectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.list_tab_fragment, container, false);
        TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
        dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}



}

my manifest 我的清单

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!-- TABS: While ViewPager will work on API 4 or above, tabs require an ActionBar. ActionBar is only
 available in API 11 or above. -->
<!-- Min/target SDK versions (<uses-sdk>) managed by build.gradle -->

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >



    <meta-data android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    <!--
    <meta-data android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    -->

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="xxxxx"/>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

.... 

    <activity
        android:name=".View_Tabs"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        >
    </activity>
</application>

my styles.xml 我的styles.xml

<resources>

    <!-- Base application theme. -->
    <!-- BEFORE <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">  -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowActionBar">true</item>
    </style>

    <style name="Theme.Base" parent="android:Theme.Light" />




</resources>

my gradle 我的朋友

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "xxxx"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.google.android.gms:play-services:6.5.87'
    //compile 'com.google.android.gms:play-services:7.0.0'
    compile files('lib/gson-2.3.jar')
}

You must extend ActionBarActivity instead of FragmentActivity to have Actionbar with fragments. 您必须扩展ActionBarActivity而不是FragmentActivity以使Actionbar具有片段。

If you're using the v7 appcompat library, your activity should instead extend ActionBarActivity, which is a subclass of FragmentActivity (for more information, read Adding the Action Bar). 如果您正在使用v7 appcompat库,那么您的活动应该扩展ActionBarActivity,它是FragmentActivity的子类(有关更多信息,请参阅添加操作栏)。

Still you can try this, 你仍然可以尝试这个,

ActionBar actionBar = (ActionBarActivity)getActivity().getSupportActionBar();

More detail you can found here. 您可以在此处找到更多细节。 http://developer.android.com/training/basics/fragments/creating.html http://developer.android.com/training/basics/fragments/creating.html

getActionBar() will return correct value only if you have the activity with a title bar. 只有当您具有带标题栏的活动时,getActionBar()才会返回正确的值。 Make sure you have set a theme with titlebar for your activity in your manifest file. 确保您在清单文件中为活动设置了标题栏主题。

在你的maifest文件中试试这个

android:theme="@style/AppTheme"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM