4

初期状況:

こんにちは、私は現在、既存のアプリの更新に取り組んでおり、特定のアクティビティに問題があります。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 クラスでエラーが発生したようです。

4

1 に答える 1

2

いくつかの提案:

  1. 7つのタブを使用している場合は、ViewPager代わりに使用することを検討してください。ユーザーエクスペリエンスを高速化するのに役立ちます。:)

  2. が呼び出されるまでFragment、が作成されたと想定しないようにしてください。これが、を取得している理由である可能性があります。ActivityonActivityCreated()NullPointerException

  3. Fragmentは、独立したUIコンポーネントとして機能する必要があります。Fragmentが相互に作用している場合は、複雑になる可能性があるため、設計を再考することをお勧めします。

  4. 作成/表示するのに非常に長い時間がかかる場合を除いて、FragmentsをプリロードするFragment必要があるかどうかはわかりません。7つのタブがある場合、ユーザーはすべてのタブを使用しない可能性があるFragmentため、すべてのタブをロードすると無駄になる可能性があります。ユーザーが次にどのタブを選択するかわからないため、選択したいくつかをプリロードしても意味がありません。最善の解決策は、新しいものを初期化しFragment、ユーザーがタブをクリックしたときにタブのビューをそれで埋めることだと私には思えます。

于 2012-10-27T15:57:26.283 に答える