Подтвердить что ты не робот

Как я могу обнаружить щелчок на заголовке ActionBar?

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

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

Существует ли подходящий способ обработки таких кликов?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

//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;
    }
}

Ответ 3

Вы можете настроить пользовательскую панель инструментов из библиотеки поддержки, объявив <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;
            }
        });