android - 使用 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);
}
解决方案
首先,你需要在片段布局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);
请让我知道问题是否已解决。
推荐阅读
- javascript - 单击按钮时,如何添加在画布上水平移动的随机大小的黑色块?
- iterator - 是否可以有条件地应用迭代器转换?
- php - 如何将多个 where 子句变量传递给 bind_param?
- octobercms - 保存用户个人资料详细信息,十月 CMS
- firebase - 是否可以从 linux shell 脚本从 Cloud Storage 检索文档?
- bitbucket - 在 bitbucket 新界面上找不到同步链接和比较按钮
- maven - 如何使用 Maven 故障安全插件来执行预集成步骤
- php - PDF 不使用 artkonekt 下载
- asp.net - 无法将“WhereEnumerableIterator`1[Object]”类型的对象转换为“System.Linq.IQueryable`1[Object]”类型
- node.js - passport.authentication 需要一个回调函数