ActionBarSherlock ライブラリを使用して、Androidアプリのタブで下位互換性のあるActionBarサポートを提供しようとしているので、最新のビルドをダウンロードし、デモをビルドし、走った。
アクションバーに移動すると、タブナビゲーションを選択すると毎回クラッシュします。スタックトレースは次のとおりです。
_09-03 02:34:47.940: ERROR/AndroidRuntime(3078): FATAL EXCEPTION: main
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.actionbarsherlock.sample.demos/com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation}: Java.lang.NullPointerException
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1748)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1764)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.access$1500(ActivityThread.Java:122)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1002)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.os.Looper.loop(Looper.Java:132)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.main(ActivityThread.Java:4025)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Java.lang.reflect.Method.invokeNative(Native Method)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Java.lang.reflect.Method.invoke(Method.Java:491)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at dalvik.system.NativeStart.main(Native Method)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Caused by: Java.lang.NullPointerException
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation.onCreate(ActionBarTabNavigation.Java:19)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1048)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1712)
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): ... 11 more
_
これが修正されるまで、アプリを進めることはできません。大量のコードを作成し、アプリにアクションバーを設定して実行しようとしましたが、getSupportActionBar()
呼び出しのnull戻り値が原因でNPEでクラッシュしました。
関連するコードは、実際にはライブラリのデモに含まれています。
_public class ActionBarTabNavigation extends FragmentActivity implements ActionBar.TabListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager()
.beginTransaction()
.add(Android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(0))
.commit();
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (int i = 0; i < 3; i++) {
ActionBar.Tab tab = getSupportActionBar().newTab();
tab.setText("Tab " + i);
tab.setTabListener(this);
getSupportActionBar().addTab(tab);
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
getSupportFragmentManager()
.beginTransaction()
.replace(Android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(tab.getPosition()))
.commit();
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}
_
Sherlockテーマをアプリケーションに追加する必要があります
<application Android:icon="@drawable/icon" Android:label="@string/app_name"
Android:debuggable="false" Android:theme="@style/Theme.Sherlock">
Android ICS 4.0.4。FragmentActivityでrequestWindowFeature(Window.FEATURE_NO_TITLE);
を使用していましたが、これは隠れていましたgetSupportActionBar()
がヌルになるICS +デバイスのActionBar。
単に削除しました:requestWindowFeature(Window.FEATURE_NO_TITLE);
そしてそれは魅力のように働いた。
それが誰かを助けることを願っています。
Honeycomb +デバイスでこれが起こるもう1つの理由は、windowNoTitle
属性がスタイルに設定されているためです。 ActionBarSherlockがHoneycomb以前のデバイスから自動的に削除するので、それを取り除きます。
getSupportActionBar()
からnullを取得するもう1つの理由は、setContentView(R.layout.main)
の前に、またはフラグメントを追加する例でそれを呼び出そうとしていることです。
Oncreateをリファクタリングし、誤ってgetSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
をsuper.onCreate(savedInstanceState);
の後に配置しました
ここに面白いものがあります:テーマを設定しないでください-
Android:theme="@style/Theme.NoActionbar"
getSupportActionBar()
からnullを取得する別の理由は、Honeycomb +のTabHostでアクティビティが使用されている場合です。
コードの書き方によって異なります。呼び出す前にまずツールバーを設定したことを確認してください。
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
マニフェストで変更しました
Android:theme="@style/AppTheme.NoActionBar"
に:
Android:theme="@style/AppTheme"
そして、エラーがなくなった
マニフェストのアクティビティまたはアプリケーションテーマとしてTheme.SherlockまたはTheme.Sherlock.Lightとして宣言されているか、これら2つのいずれかを継承するカスタムテーマを使用している
例:-
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/Theme.Sherlock.Light" >
また、暗いテーマを使用できます:-
Android:theme="@style/Theme.Sherlock"
sherlockライブラリを使用してカスタムビューを設定するたびに。このrequestWindowFeature(Window.FEATURE_NO_TITLE)を削除するだけです。このように、Sherlockバーライブラリを使用してカスタムビューを作成します。
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.header_sherlock_xmllayout);
header_tvleft = (TextView) findViewById(R.id.header_tvleft);
header_tvleft.setText("Back");
super.onCreate()
の呼び出しを(わずかに)忘れた後、この問題が発生しました。
プロジェクトにライブラリを追加した後、これに遭遇しました。解決策は、マニフェストでこの同じテーマ名を使用している場合、ライブラリを調べて「AppTheme」というスタイル名を削除することでした。 Galaxy Tabで競合が発生したのに対し、Galaxy S4であるJelly Beanで競合は発生しませんでした。
追加した Android:theme="@Android:style/Theme.Dialog"
Androidマニフェストファイルをダイアログアクティビティにするためのマニフェストファイル。これもアクションバーを削除するため、nullポインターになります。削除するか、getSupportActioBar
を呼び出さないでください。
フラグメントxmlファイルにtoobarを追加するため、この間違いを犯します。フラグメントでツールバーを見つけるためのコードはこれです:getActivity()。findViewByid(id ...)、私のツールバーはフラグメントxmlファイルにあります。 getSupportActionBar()の場合。覚えておいてください:フラグメントのxmlファイルにツールバーを入れないでください。