Как я могу обнаружить щелчок на заголовке ActionBar?
Для конкретного требования к клиенту я должен разрешить пользователю моего приложения (не будет опубликовано в Market) щелкнуть заголовок ActionBar для выполнения некоторых действий.
Я смотрю в Android-источнике, но я не могу найти идентификатор для заголовка actionBar TextView.
Существует ли подходящий способ обработки таких кликов?
Ответы
Ответ 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;
}
});