初期状況:
こんにちは、私は現在、既存のアプリの更新に取り組んでおり、特定のアクティビティに問題があります。7 つのタブが含まれており、これらのタブには、さまざまな方法のイメージボタンとテキストビューがいくつかあります。
アプリの元のバージョンではタブホストを使用し、基本的に 1 つの xml ファイルと 1 つの Java ファイルに必要なすべてのコンテンツが含まれていましたが、tabcontent を横にスワイプしてタブを変更することはできなかったので、フラグメントを使用して全体を再作成しました.
チャレンジ:
ActionBarには、フラグをチェックして7つのフラグメントクラスすべてのメソッドを呼び出し、rootViewのビューをGONEに設定し、切り替えた場合、すべてのタブから特定のテキストビューとイメージボタンを非表示にすることになっているフィルターボタンがあります再び、VISIBLE に。
問題:
ユーザーが最初にすべてのタブをスクロールすると、この ActionBar ボタンは正常に機能しますが、アプリのコールド スタートをクリックすると、NullPointer 例外でアプリがクラッシュします。すべてのフラグメントがまだロードされていないため、これが原因であると思われます。
質問:
アクティビティの開始時にすべてのフラグメントをプリロードする必要がありますか? もしそうなら、私はそれをどのように行い、どのファイルでそれを達成しますか? 以前にどのフラグメントが開かれたかわからなくても、ActionBar からすべてのタブ/フラグメントを操作できることを確認する別の、おそらくより良い方法はありますか? これらすべてのメソッドを 1 つのグローバル メソッドにマッシュアップする必要がありますか? どのファイルに入れますか?
現在のところ、最初にすべてのタブをスクロールした場合にのみ機能します。その後、フィルターを何度でも切り替えることができます。
コード:
これは Activity クラスで呼び出されます。
public void toggleintroonly() {
MenuItem toggle = menu.findItem(R.id.mtoggle);
if (visible == 1) {
Fragments1.toggleintroonly();
Fragments2.toggleintroonly();
Fragments3.toggleintroonly();
Fragments4.toggleintroonly();
Fragments5.toggleintroonly();
Fragments6.toggleintroonly();
Fragments7.toggleintroonly();
toggle.setTitle(getString(R.string.menu4toggled));
toggle.setIcon(R.drawable.ic_action_showall);
visible = 0;
} else {
Fragments1.showall();
Fragments2.showall();
Fragments3.showall();
Fragments4.showall();
Fragments5.showall();
Fragments6.showall();
Fragments7.showall();
toggle.setTitle(getString(R.string.menu4));
toggle.setIcon(R.drawable.ic_action_filter);
visible = 1;
}
}
これは Fragments1.toggleintroonly() のサンプルです。
public static void toggleintroonly() {
rootView.findViewById(R.id.tv1x02).setVisibility(View.GONE);
rootView.findViewById(R.id.bplay1x02).setVisibility(View.GONE);
rootView.findViewById(R.id.bshare1x02).setVisibility(View.GONE);
rootView.findViewById(R.id.binfo1x02).setVisibility(View.GONE);
rootView.findViewById(R.id.bring1x02).setVisibility(View.GONE);
}
アクティビティが起動された直後に、ActionBar の Filter Button がクリックされたときのエラーは次のとおりです。
10-27 16:43:34.923: E/MediaPlayer(16946): mOnCompletionListener is null. Failed to send MEDIA_PLAYBACK_COMPLETE message.
10-27 16:43:49.433: D/AndroidRuntime(16946): Shutting down VM
10-27 16:43:49.433: W/dalvikvm(16946): threadid=1: thread exiting with uncaught exception (group=0x40c511f8)
10-27 16:43:49.448: E/AndroidRuntime(16946): FATAL EXCEPTION: main
10-27 16:43:49.448: E/AndroidRuntime(16946): java.lang.NullPointerException
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.Fragments3.toggleintroonly(Fragments3.java:225)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.NicknamesNew.toggleintroonly(NicknamesNew.java:121)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.NicknamesNew.onOptionsItemSelected(NicknamesNew.java:90)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.app.Activity.onMenuItemSelected(Activity.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.view.View.performClick(View.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.view.View$PerformClick.run(View.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Handler.handleCallback(Handler.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Handler.dispatchMessage(Handler.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Looper.loop(Looper.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.app.ActivityThread.main(ActivityThread.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at java.lang.reflect.Method.invokeNative(Native Method)
10-27 16:43:49.448: E/AndroidRuntime(16946): at java.lang.reflect.Method.invoke(Method.java:511)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-27 16:43:49.448: E/AndroidRuntime(16946): at dalvik.system.NativeStart.main(Native Method)
アクティビティの開始時に Fragments1 がアクティブで、その直接の隣の Fragments2 もプリロードされるため、Fragments3 クラスでエラーが発生したようです。