Как я могу обнаружить щелчок по заголовку ActionBar? - PullRequest
29 голосов
/ 02 ноября 2011

В соответствии с конкретными требованиями клиента, я должен разрешить пользователю моего приложения (не будет публиковаться в Market) нажимать на заголовок ActionBar для выполнения некоторых действий.

Я искал источник Android, но не могу найти идентификатор для заголовка ActionBar TextView.

Есть ли правильный способ обрабатывать такие клики?

Ответы [ 3 ]

28 голосов
/ 02 ноября 2011

Название AFAIK не активируется. Значок / логотип кликабельны - вы получите это через android.R.id.home в onOptionsItemSelected(). Вполне возможно, что название также направлено таким образом, хотя они не упоминают об этом, и я бы не стал на это полагаться.

Звучит так, как будто вы хотите, чтобы пользователь Spinner выбрал действия для выполнения. Если это так, используйте setListNavigationCallbacks(). Если вы хотите удалить заголовок как лишний, используйте setDisplayOptions(0, DISPLAY_SHOW_TITLE).

Если вы хотите что-то кроме Spinner в левой части панели действий, используйте setDisplayOptions(DISPLAY_SHOW_CUSTOM, DISPLAY_SHOW_CUSTOM) и setCustomView(). Обратите внимание, что такой подход не рекомендуется ( «Избегайте использования пользовательских режимов навигации на панели действий» ), поскольку он может не работать с телефонами, особенно в портретном режиме.

Другой возможностью было бы удалить заголовок и использовать логотип вместо значка, и в логотипе укажите свой «заголовок» как часть изображения. Весь логотип должен быть кликабельным, поднятым через onOptionsItemSelected().

9 голосов
/ 02 ноября 2011

// 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;
    }
}
6 голосов
/ 10 ноября 2015

Вы можете настроить пользовательскую панель инструментов из библиотеки поддержки, объявив <android.support.v7.widget.Toolbar> в своем макете (см. Ответ Криса Бейнса для полного примера макета панели инструментов).

<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;
            }
        });
...