首页 > 解决方案 > 使用 getActionBar.setTitle() 时应用程序崩溃;同时扩展 FragmentActivity

问题描述

应用程序在 getActionBar.setTitle(....) 中出现空指针异常时崩溃?如何解决?我尝试了 getSupportActionBar 而不是 getActionBar.. 但它不起作用?有人能帮我吗 ..

package com.msinfolab.mandy.tfq;

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.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends FragmentActivity{

    private Fragment contentFragment;
    QuotecardListFragment pdtListFragment;
    FavoriteListFragment  favListFragment;

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

        FragmentManager fragmentManager = getSupportFragmentManager();

        /*
         * This is called when orientation is changed.
         */
        if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("content")) {
                String content = savedInstanceState.getString("content");
                if (content.equals(FavoriteListFragment.ARG_ITEM_ID)) {
                    if (fragmentManager.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID) != null) {
                        setFragmentTitle(R.string.favorites);
                        contentFragment = fragmentManager
                                .findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID);
                    }
                }
            }
            if (fragmentManager.findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID) != null) {
                pdtListFragment = (QuotecardListFragment) fragmentManager
                        .findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID);
                contentFragment = pdtListFragment;
            }
        } else {
            pdtListFragment = new QuotecardListFragment();
            setFragmentTitle(R.string.app_name);
            switchContent(pdtListFragment, QuotecardListFragment.ARG_ITEM_ID);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (contentFragment instanceof FavoriteListFragment) {
            outState.putString("content", FavoriteListFragment.ARG_ITEM_ID);
        } else {
            outState.putString("content", QuotecardListFragment.ARG_ITEM_ID);
        }
        super.onSaveInstanceState(outState);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_favorites:
                setFragmentTitle(R.string.favorites);
                favListFragment = new FavoriteListFragment();
                switchContent(favListFragment, FavoriteListFragment.ARG_ITEM_ID);

                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void switchContent(Fragment fragment, String tag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        while (fragmentManager.popBackStackImmediate());

        if (fragment != null) {
            FragmentTransaction transaction = fragmentManager
                    .beginTransaction();
            transaction.replace(R.id.content_frame, fragment, tag);


            if (!(fragment instanceof QuotecardListFragment)) {
                transaction.addToBackStack(tag);
            }
            transaction.commit();
            contentFragment = fragment;
        }
    }



    protected void setFragmentTitle(int resourseId) {
        setTitle(resourseId);

        getActionBar().setTitle(resourseId);

    }


    @Override
    public void onBackPressed() {
        FragmentManager fm = getSupportFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
            super.onBackPressed();
        } else if (contentFragment instanceof QuotecardListFragment
                || fm.getBackStackEntryCount() == 0) {
            finish();
        }
    }
}

这部分代码警告空指针异常..如何纠正它?

protected void setFragmentTitle(int resourseId) {
        setTitle(resourseId);

        getActionBar().setTitle(resourseId);

    }

和另一个警告..等于可能会产生空指针异常..如何解决这个问题

if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("content")) {
                String content = savedInstanceState.getString("content");
                if (content.equals(FavoriteListFragment.ARG_ITEM_ID)) {
                    if (fragmentManager.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID) != null) {
                        setFragmentTitle(R.string.favorites);
                        contentFragment = fragmentManager
                                .findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID);
                    }
                }
            }
            if (fragmentManager.findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID) != null) {
                pdtListFragment = (QuotecardListFragment) fragmentManager
                        .findFragmentByTag(QuotecardListFragment.ARG_ITEM_ID);
                contentFragment = pdtListFragment;
            }
        } else {
            pdtListFragment = new QuotecardListFragment();
            setFragmentTitle(R.string.app_name);
            switchContent(pdtListFragment, QuotecardListFragment.ARG_ITEM_ID);
        }

标签: androidandroid-actionbarfragmentandroid-fragmentactivity

解决方案


首先,你需要在片段布局XML中定义自己的工具栏,你做完了吗?

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary">

</android.support.v7.widget.Toolbar>

然后在您的onCreate方法中,设置标题之前,您需要执行以下操作:

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

最后,在您的 setFragmentTitle 方法中,您将工具栏标题设置为:

((Toolbar) findViewById(R.id.toolbar)).setTitle(resourseId);

请让我知道问题是否已解决。


推荐阅读