0

私のアプリケーションでは、メイン アクティビティは 2 つのフラグメントをホストし、ActionBarTabs としてアクティビティに接続されています。次のコードを使用します。注: アクティビティと 2 つのフラグメントは、個別の xml レイアウト ファイルで定義されます(下部の図を参照)。

    private void createActionTabs() {
        ActionBar actionBar = getActionBar();

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        //Status Tab
        String strStatus = getResources().getString(R.string.lblStatus);
        ActionBar.Tab statusTab = actionBar.newTab();

        statusTab.setText(strStatus);
        TabListener<SFrag> sFTabListener = new TabListener<SFrag>(this, strStatus, SFrag.class);
        statusTab.setTabListener(sFTabListener);
        actionBar.addTab(statusTab);

        //Controller Tab attached the same way
        .....

}

ActionBar 項目 (開始と更新) は、次を使用して追加されます

    public boolean onCreateOptionsMenu(Menu menu) {
       MenuInflater inflater = getMenuInflater();
       inflater.inflate(R.menu.main_menu, menu);
       return true;
}

今私の問題に来ています:

  1. アプリケーションのロード、フラグメントの再開、およびアクション バーからの更新メニュー項目のクリック時に、ステータス フラグメントに表示されるデータを更新したいと考えています。次のコードを使用して Main Activity から Status フラグメントにアクセスしようとすると

    SFrag frag = (SFrag) getFragmentManager().findFragmentById(R.id.st_frag);
    
        Log.d(TAG, "In Activity SFrag is " + (frag == null ? "null" : "not null"));
    
        if (frag != null) {
            //calls the method to update data
            fragment.updateStatusData(statusInformation);
        }
    

getFragmentManager ().findFragmentByIdメソッドは常に null を返します。アクティビティの onResume メソッドを試してみましたが、フラグメント オブジェクトは引き続き null として返されます。では、どのようにフラグメントにアクセスし、ホスト アクティビティからそのフラグメントのメソッドにアクセスするのでしょうか。

  1. 次に、アクション バーで action_service (このモックアップの [開始] ボタンとして表示されます) を、バックグラウンド サービスを停止または停止するためのトグルとして使用しようとしています。onOptionsItemSelectedメソッドからスタート メニュー項目のタイトル/アイコンを簡単に更新できます(現在のステータスを実行中/停止済みの共有設定に保存します)。しかし、アクティビティの onStart/onResume で menuItem にアクセスしようとすると、

     MenuItem mi = (MenuItem) findViewById (R.id.action_service);
    

常に null を返します。では、onResume/onStart の action_service メニュー項目にアクセスして更新するにはどうすればよいでしょうか。

私のアプリケーションは次のようになります私のアプリケーションのモックアップ

4

2 に答える 2

1

他の部分ではなく、MenuItem 部分に答えることができます。

ドキュメントに従ってメニュー項目のYou can safely hold on to menu (and any items created from it), making modifications to it as desired, until the next time onCreateOptionsMenu() is called.

例えば

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    actionMenu = menu;
    return true;
}

基本的に、アイテムの1つを変更したいときはいつでもこれを行うことができます

MenuItem item = actionMenu.getItem(0);
于 2013-07-17T15:18:06.943 に答える