0

で使用ActionBar TabsしていAndroid 4ます。私は5つ持ってBroadcast receiversいますが、それらすべてがUIの一部を更新します。私のアプリには2つのタブがあり、両方のタブに異なるUIが関連付けられています(つまり、両方のタブに異なるxmlファイルが関連付けられており、inflatedタブの選択に応じて異なります)。タブごとに、を膨らませていfragmentます。

最初は、タブを1つだけ表示しています。そのタブに関連付けられているUIからボタンをクリックすると、別のタブを追加し、5つのブロードキャストレシーバーを受信します。私は放送受信機を任意の順序で入手します。ここで、次の放送受信機があるとしましょう。A B C D E

A, B, D and E updates the UI which is part of Tab 1.   

C updates the UI which is part of Tab 2.

新しいタブが作成されるたびに、そのUIは前のタブのUIに置き換えられるため、たとえばA and B呼び出されると、からのUIが更新されますTab 1が、C受信されると、UIはUIに置き換えられ、 UIがTab2's更新されます。しかし、D and Eが受信されると、のUIを更新しようとしますtab 1が、現在は膨張しているため、変更を試みたtab 2ステートメントでnullポインター例外が発生します。D and E

では、UIに応じてどのように更新すればよいのか教えてくださいbroadcasters

更新:今、私は次のようにNPEを取得しています:これは私の受信機の1つにあり、ここで新しいタブを作成していて、放送受信機からテーブルを挿入したいと思います。

ActionBar actionbar = getActionBar();
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab bTab = actionbar.newTab().setText("B");
bFragment = new BFragment();
bTab.setTabListener(new MyTabsListener(bFragment));
actionbar.addTab(bTab, true);

final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mdsTable); // NPE linearLayout is not getting initialized.

私は次のように実装MyTabsListenerしたので、なぜこれが起こっているのかわかりません:

class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(StartActivity.appContext, "Reselected!",
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(fragment);
    }
}

更新:レシーバー部分にコメントを付け(タブを動的に作成できるかどうかを確認するだけで)、レシーバーの外部で同じことを記述しても、問題なく実行されます。

私を助けてください。

4

2 に答える 2

0

私はこの問題を次の方法で解決しました:

BroadCastReceiversが呼び出されると、onReceive()メソッドに含まれるすべてのデータを保存し、ユーザーが任意のタブに移動すると、それonCreateView()が呼び出されるので、このメソッドで UI を更新します。したがって、Tab2 から直接 Tab1 に直接移動する問題はありません。すべては、いつタブ 2 からタブ 1 に移動したいかというユーザーの選択に基づいており、UI が更新されてNPE解決されます。

于 2012-08-24T06:13:41.140 に答える
0

mdsTableほとんどの場合、id のビューを現在のレイアウトに関連付けていません。これらのコード サンプルだけでは、問題の原因を特定するのは困難です。どのレイアウトが含まmdsTableれており、このレイアウトをどこでインフレートしますか?

于 2012-06-11T13:49:32.260 に答える