Скрытие тоста для длительного нажатия на элемент actionBar
Возможно ли, как скрыть тост после длительного нажатия на элемент ActionBar? Я не настраивал заголовок для элемента, но он все еще там - пустой тост.
<item
android:id="@+id/ab_main_menu_dots"
android:icon="@drawable/action_icons_dots"
android:showAsAction="always">
<menu>
<item
android:id="@+id/ab_main_menu_my_profile"
android:showAsAction="never"
android:title="@string/ab_my_profile">
</item>
<item
android:id="@+id/ab_main_menu_settings"
android:showAsAction="never"
android:title="@string/menu_settings">
</item>
<item
android:id="@+id/ab_main_menu_help"
android:showAsAction="never"
android:title="@string/tv_help_login">
</item>
<item
android:id="@+id/ab_main_menu_about_us"
android:showAsAction="never"
android:title="@string/ab_about_us">
</item>
<item
android:id="@+id/ab_main_menu_logout"
android:showAsAction="never"
android:title="@string/bt_logout_main">
</item>
</menu>
</item>
Ответы
Ответ 1
Единственный способ скрыть тост - это когда вы устанавливаете пункт меню ActionBar
для отображения с текстом. android:showAsAction="withText"
. В противном случае тост добавляет уточнение того, что представляет собой каждый элемент элемента действия, даже если для элемента меню нет названия.
Ответ 2
Вы можете изменить onLongClick
в ActionMenuItemView Класс, чтобы остановить Тостинг при длительном нажатии.
но будьте осторожны, он работает только с устройствами с API менее 11, потому что библиотека sherlockactionbar, проверяющая уровень API вашего устройства на Build.VERSION.SDK_INT
, и если у вас есть более новое устройство, оно просто использует панель действий по умолчанию, которую вы не изменяете.
Ответ 3
Вероятно, самый чистый способ сделать это - назначить настраиваемое действие для вашего элемента меню, который имитирует внешний вид обычного.
Поскольку вы упомянули, что используете ActionBarSherlock, вот простой пример.
Представьте себе следующее menu.xml, которое накачивается в Activity
.
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/ab_main_menu_dots"
android:actionLayout="@layout/ab_main_menu_dots_layout"
android:showAsAction="always"/>
</menu>
Вы можете определить ab_main_menu_dots_layout.xml, чтобы имитировать кнопку переполнения следующим образом:
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Widget.Sherlock.ActionButton.Overflow"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Результатом является элемент меню, который выглядит как кнопка переполнения и не отображает сообщение Toast
, когда вы его долго нажимаете, независимо от того, используется ли родной ActionBar или ABS. До вас взять это отсюда. Вместо этого вы хотите пересмотреть и соблюдать рекомендации.
Ответ 4
В onCreateOptionsMenu
назначьте задачу отключить длинный клик в нужном пункте меню. Вот пример
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.my_menu, menu);
new Handler().post(new Runnable() {
@Override
public void run() {
final View v = getActivity().findViewById(R.id.your_menu_item);
if (v != null) {
v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
}
}
});
}
Ответ 5
Вот как я это сделал:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem item = menu.findItem(R.id.no_toast);
item.setActionView(R.layout.custom_view);
item.getActionView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//handle click (just this item)
}
});
return true;
}
и это мое меню:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:title="Never gonna see me in a toast!"
app:showAsAction="always"
android:id="@+id/no_toast" />
</menu>
мой пользовательский вид - это просто ImageButton
:
<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/icon" />
Примечание. не забудьте установить стиль, Widget.AppCompat.Toolbar.Button.Navigation
отображает IamgeButton
на панели инструментов правильно.
P.S: Лично я предпочитаю поведение по умолчанию, но это был мой случай:
Я отключил право на поддержку для моего приложения, и после этого, когда я установил языковой стандарт по умолчанию на язык rtl, тост появлялся не в ту сторону! Честно говоря, я торопился и не узнал причину, но я буду признателен, если кто-нибудь сообщит мне, почему, во всяком случае, это то, как я прошел.
Ответ 6
Это можно сделать с помощью пользовательского вида действий, как показано ниже:
action_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:support="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/item1"
support:showAsAction="always">
</item>
</menu>
custom_action_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:paddingRight="5dp" >
<ImageButton
android:id="@+id/customActionItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="@drawable/abc_item_background_holo_dark"
android:src="@drawable/bulb_icon" />
</RelativeLayout>
и код надувного меню меню:
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_menu, menu);
final MenuItem item1= menu.findItem(R.id.item1);
MenuItemCompat.setActionView(item1, R.layout.custom_action_view);
View vItem1= MenuItemCompat.getActionView(item1);
final ImageButton customActionItem= (ImageButton) vItem1.findViewById(R.id.customActionItem);
customActionItem.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// do something here
}
});
return super.onCreateOptionsMenu(menu);
}
Ответ 7
Вы можете попытаться создать свой собственный ActionBar
. Вот учебник о том, как это сделать:
Пользовательская панель действий
Ответ 8
посмотрите этот вопрос, я уверен, что вы хотите этого достичь.
Ответ 9
Для меня решение использовало:
android.support.v4.view.MenuItemCompat
Итак, вместо раздувания меню из XML:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.refresh_menu, menu);
return true;
}
Я создал элементы программным способом с помощью MenuItemCompat:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem refreshItem = menu.add(Menu.NONE, R.id.menu_item_refresh, Menu.NONE, R.string.general_pop_up_dialog_btn_cancel);
MenuItemCompat.setActionView(refreshItem, R.layout.actionbar_custom_view_refresh);
MenuItemCompat.setShowAsAction(refreshItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
return true;
}
Ответ 10
Есть способ, если вы используете ActionBarSherlock. Найдите файл ActionMenuItemView.java в библиотеке и просто прокомментируйте весь метод onLongClick.