web-dev-qa-db-ja.com

ActionBarタイトルのクリックを検出するにはどうすればよいですか?

特定の顧客の要件については、アプリのユーザー(Marketで公開されません)がActionBarタイトルをクリックしてアクションを実行できるようにする必要があります。

Androidソースを探していましたが、actionBar TextViewタイトルのIDを見つけることができません。

そのようなクリックを処理する適切な方法はありますか?

29
Waza_Be

タイトルはクリック不可です。アイコン/ロゴはクリック可能です。onOptionsItemSelected()の_Android.R.id.home_で取得できます。おそらく、タイトルもこの方法でルーティングされますが、彼らはそれについて言及せず、私はそれに依存しません。

ユーザーが実行するアクションを選択するためのSpinnerが必要なようです。その場合は、setListNavigationCallbacks()を使用します。不要なタイトルを削除する場合は、setDisplayOptions(0, DISPLAY_SHOW_TITLE)を使用します。

アクションバーの左側にあるSpinner以外のものが必要な場合は、setDisplayOptions(DISPLAY_SHOW_CUSTOM, DISPLAY_SHOW_CUSTOM)およびsetCustomView()を使用します。このアプローチは推奨されないことに注意してください( "アクションバーでカスタムナビゲーションモードを使用しない" )。特にポートレートモードでは、電話機ではうまく機能しない可能性があります。

別の可能性は、タイトルを削除し、アイコンの代わりにロゴを使用し、ロゴに画像の一部として「タイトル」を含めることです。ロゴ全体がクリック可能で、onOptionsItemSelected()を介して選択される必要があります。

28
CommonsWare

// onCreate

ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
//        View actionBarView = getLayoutInflater().inflate(R.layout.action_bar_custom_view, null);
        actionBar.setCustomView(actionBarView);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

//your logic for click listner
 setListenerForActionBarCustomView(actionBarView);

 private void setListenerForActionBarCustomView(View actionBarView) {
        ActionBarCustomViewOnClickListener actionBarCustomViewOnClickListener = new ActionBarCustomViewOnClickListener();
        actionBarView.findViewById(R.id.text_view_title).setOnClickListener(actionBarCustomViewOnClickListener);
}
 private class ActionBarCustomViewOnClickListener implements OnClickListener {
        public void onClick(View v) {       
        switch(v.getId()) {
            case R.id.text_view_title:

                //finish();
                break;
    }
}
9
Padma Kumar

レイアウトで<Android.support.v7.widget.Toolbar>を宣言することにより、サポートライブラリからカスタムツールバーを設定できます(ツールバーレイアウトの完全な例については Chris Banesの回答 を参照してください)。

<LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <!-- We use a Toolbar so that our drawer can be displayed
             in front of the action bar -->
        <Android.support.v7.widget.Toolbar
            Android:id="@+id/my_awesome_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:background="@color/main_toolbar" 
            Android:minHeight="?attr/actionBarSize" />

       <FrameLayout 
            Android:id="@+id/container"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />


</LinearLayout>

他のほとんどのビューと同様に、アクティビティにクリックリスナーを追加できます。

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MyActivity.this, "Test", Toast.LENGTH_LONG).show();
            }
        });

タイトルのタッチイベントをキャプチャする場合:

toolbar.setOnTouchListener(new View.OnTouchListener() {
            Rect hitrect = new Rect();
            public boolean onTouch(View v, MotionEvent event) {
                if (MotionEvent.ACTION_DOWN == event.getAction()) {
                    boolean hit = false;
                    for (int i = toolbar.getChildCount() - 1; i != -1; i--) {
                        View view = toolbar.getChildAt(i);
                        if (view instanceof TextView) {
                            view.getHitRect(hitrect);
                            if (hitrect.contains((int)event.getX(), (int)event.getY())) {
                                hit = true;
                                break;
                            }
                        }
                    }
                    if (hit) {
                        //Hit action
                    }
                }
                return false;
            }
        });
6
Boris Treukhov