10

ドロップダウン メニューで ActionBar を使用してonNavigationItemSelected()おり、Activity が作成されるとすぐに呼び出されるため、最初の項目が呼び出されます。ドロップダウン メニューの最初の項目は Home です。これはアプリケーション アイコンを押すのと同じアクションなandroid.R.id.homeので、アプリケーションの起動時にそれ自体が呼び出されます。これを回避するために、次のコードがあります。

if(this.getClass() != FrecView.class){  //if i am not currently on the Activity
    Intent frec = new Intent(this, FrecView.class);
    frec.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(frec);
}

しかし、私はすべてのアクティビティに ActionBar を持っているので、すべてのアクティビティが開始されるたびに自分自身を永遠に呼び出すので、各アクティビティにそのコードを配置する必要があります。何が起こっている?どうすればこれを防ぐことができますか?

4

4 に答える 4

5

マークが述べたように、それはメニューとして設計されていません。

ただし、最初の呼び出しを無視するための簡単で汚いアプローチを次に示します。

このクラス フィールドを宣言します。

//mNaviFirstHit should be initialized to true
private boolean mNaviFirstHit = true;

そして onNavigationItemSelected で:

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    if (mNaviFirstHit) {
        mNaviFirstHit = false;
        return true;
    }
    // DO WHAT YOU WOULD NORMALLY DO
}
于 2013-02-18T11:30:36.173 に答える
4

私はActionBarとドロップダウンメニューを使用しています.onNavigationItemSelected()はActivityが作成されるとすぐに呼び出されます

タブが「メニュー」として設計されているのと同様に、これは「メニュー」として設計されていません。リスト ナビゲーションは、ユーザーが現在のアクティビティの一部のコンテンツを示すことができるように設計されており、通常はフラグメントを置き換えます。アクション アイテム (ツールバー ボタン、アクション スピルオーバー エリアなど) は、アクティビティ間を移動するためのものです。

私のドロップダウンメニューの最初の項目は Home です。これはアプリケーションアイコンを押すのと同じアクションです android.R.id.home ので、アプリケーションが起動するとそれ自体が呼び出されます。

だから、あなたの「メニュー」からそれを削除してください。ユーザーは左側のアプリ アイコンを押してホームに移動できます。

于 2012-04-16T00:06:48.627 に答える
3

次のようにして、「メニュー」で正しいデフォルトオプションを強制できます。

bar.setListNavigationCallbacks(mNavigationAdapter, this);
bar.setSelectedNavigationItem(indexOfCurrentActivityInTheMenu);

直感に反して、これはコールバックを設定した後に行う必要があります (私の考えでは、ナビゲーション インデックス 0 でコールバックを起動する機会が与えられます)。たとえば、私のアプリには ListView と PageView の 2 つのアクティビティがあり、アルファベット順に並べられたナビゲーション メニューが気に入っていますが、デフォルトの起動アクティビティは PageView です。したがって、PageView の onCreate() には次のようなものがあります。

bar.setListNavigationCallbacks(mNavigationAdapter, this);
bar.setSelectedNavigationItem(1);

および ListView の onCreate() で:

bar.setListNavigationCallbacks(mNavigationAdapter, this);
bar.setSelectedNavigationItem(0);

その後、何回 startActivity(otherView) を呼び出しても、常にナビゲーション メニューが正しく設定されます。

于 2014-03-12T00:24:04.967 に答える
0

まず、@CommonsWare がタブに代わるものであることを思い出させてくれたことに感謝します。そのため、コードはその観点から設計する必要があります。見た目ほど簡単ではありませんが、それでも回避できます。

これは、フラグを使用して回避することもできます。しかし、とにかく、これを修正するために取ったアプローチを提案します。

一度呼び出されることを確認してください。それに加えて、匿名よりも内部クラスにします。これにより、コードのこの部分が実行されるたびに呼び出されるのを防ぐことができます。以下のコード:

if(localOnNavigationListener != null)
    localOnNavigationListener = new LocalOnNavigationListener();

class LocalOnNavigationListener implements OnNavigationListener{

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    // do something
    return true;
  }

}

そして、ここで奇妙なイベントが発生します。内部クラスにすると、onNavigationItemSelected() は呼び出されません。匿名クラスにすると、onNavigationItemSelected メソッドが起動します。誰かがこれに光を当てることができれば、それは役に立ちます。

于 2013-07-12T06:17:24.990 に答える