[英]custom actionbar menu item not responding on one click
我為菜單項創建了自定義布局。 現在我需要它在點擊時加載一個新活動。 代碼邏輯如下:
資源中的菜單聲明:
<item android:id="@+id/shoppingCart"
android:title="cart"
android:background="@layout/basket_notification_counter"
android:icon="@drawable/ic_add_shopping_cart_white_24dp"
app:showAsAction="always" />
活動由各個選項卡下的片段組成。 從我在這里收集的內容來看,我需要調用setHasOptionsMenu(true);
在片段內的onCreateView
方法中,我已經這樣做了。
現在在活動內部,兩個主要的重要方法,分別是onCreateOptionsMenu
和onOptionsItemSelected
,如下所示:
package project.activities;
//... Imports come here
public class SalesActivity extends ActionBarActivity
{
private final static String TAG = "PROJECT";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sales);
// Setup the action bar
runOnUiThread(new Runnable() {
@Override
public void run() {
showActionBar();
}
});
}
/**
* Creates menus found the action bar
*
* @param menu the menu to work on
* @return true
*/
@Override
public boolean onCreateOptionsMenu(final Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_sale, menu);
final MenuItem item = menu.findItem(R.id.shopping_cart);
// THIS IS THE PROBLEM
// This workd but erratcally. After a number of clicks, it loads the activity specified in onOptionsItemSelected
// This is random: sometimes one click, sometimes 2 or up to 7 clicks so far.
item.getActionView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
menu.performIdentifierAction(item.getItemId(), 0);
}
});
/**
// Also tried this but didn't work. Didn't also throw an exception to tell something was wrong
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
LoggedInActivity.this.showCart();
return true;
}
});
*/
return true;
}
/**
* Handles menus in lists
*
* @param item the selected item
* @return the selected item
*/
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
switch (id) {
case R.id.shopping_cart:
Intent intent = new Intent(LoggedInActivity.this, CheckOutActivity.class);
startActivity(intent);
return true;
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* When the screen is rotated, this method is called
*
* @param newConfig the new app configuration
*/
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
/**
* Recreates an item in cases where the app is pushed to the background
*
* @param savedInstanceState the bundle
*/
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
}
/**
* Handles the action bar
*/
public void showActionBar()
{
// Initialize the action bar
ActionBar actionBar = getSupportActionBar();
//actionBar.setElevation(0);
// Set up tabs
showActionBarTabs(actionBar);
}
/**
* Setup the actionbar tabs
* @param actionBar the actionBar we get from the activity and style
*/
public void showActionBarTabs(final ActionBar actionBar)
{
//... I set up the actionbar tabs here
}
}
問題如下:單擊操作欄中的菜單項時,它的工作方式相當“隨機”。 有時,它會在一次點擊后工作,其他時候它會加載活動 4 次點擊或 3 次點擊。 沒有 1 次點擊的一致性。 似乎是什么問題?
請在你的
onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)
方法
科特林
inflater.inflate(R.menu.my_menu, menu)
menu.findItem(R.id.my_custom_item).actionView.setOnClickListener {
println("КЛИК")
}
爪哇
inflater.inflate(R.menu.my_menu, menu)
findItem(R.id.my_custom_item).getActionView().setOnClickListener(v -> System.out.println("click");
它對我有用
看看你的菜單項 clickable 應該是 true 或者刪除android:clickable="fales"
並刪除android:actionLayout="@layout/basket_notification_counter"
,你的菜單項看起來像這樣。
<item android:id="@+id/shopping_cart"
android:title="cart"
android:icon="@drawable/ic_add_shopping_cart_white_24dp"
android:clickable="true"
app:showAsAction="always" />
或者
<item android:id="@+id/shopping_cart"
android:title="cart"
android:icon="@drawable/ic_add_shopping_cart_white_24dp"
app:showAsAction="always" />
我的應用程序遇到了同樣的問題。 正在創建操作欄,但沒有響應點擊。 我以前在該活動上有相對布局,我將其更改為線性布局並將小部件的大小和方向調整為以前的樣子。 它為我解決了這個問題。 試一試。 希望能幫助到你 :)
問題在於您的自定義菜單項布局。 嘗試為您的菜單添加自定義點擊偵聽器
<item android:id="@+id/shoppingCart"
android:title="cart"
android:background="@layout/basket_notification_counter"
android:icon="@drawable/ic_add_shopping_cart_white_24dp"
app:showAsAction="always"
android:onClick="shoppingCartClickListener"/>
和
public void shoppingCartClickListener(View v) {
// Process click here
}
希望有幫助
而不是使用 android:actionLayout
使用此方法更改活動上的圖標
public static Drawable convertLayoutToImage(Context mContext, int count, int drawableId) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.{your_custom_layout}, null);
/*Edit other elements here*/
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.setDrawingCacheEnabled(true);
view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
return new BitmapDrawable(mContext.getResources(), bitmap);
}
您必須編輯它以適合您的配置
要更改圖標,請執行此操作
menuItem.setIcon(Converter.convertLayoutToImage(localContext, 2, R.drawable.{your_drawable_resource}));
因為您的活動的布局根 GroupView 可以防止將點擊事件分派到工具欄菜單項(如果您正在使用工具欄,例如與 CoordinatorLayout 一起使用),您應該嘗試添加
android:focusable="false"
android:clickable="false"
到您的根 GroupView
您還需要覆蓋 onOptionsItemSelected 如下(Kotlin 版本):
override fun onOptionsItemSelected(item: MenuItem): Boolean {
super.onOptionsItemSelected(item)
when (item.itemId) {
R.id.menu_favorite -> {
handleFavorite(item)
}
}
return true
}
並且不要忘記將 MenuItem 作為參數傳遞給您的函數,即使您不使用它:
private fun handleFavorite(item: MenuItem) {
//TODO: Whatever you need
}
對於上述解決方案可能不起作用的人,
確保您的<Toolbar>
是<AppbarLayout>
的子項,如下所示:
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.appcompat.widget.Toolbar
android:background="@drawable/white_grey_border_bottom"
android:id="@+id/homeActivityToolbar"
android:layout_width="match_parent"
app:titleTextColor="@color/dark_grey"
android:layout_height="50dp" app:layout_constraintTop_toTopOf="parent"/>
</com.google.android.material.appbar.AppBarLayout>
順便說一句,我的項目使用的是 AndroidX,所以如果您復制粘貼此代碼,請務必小心。
遇到了類似的問題。 操作欄已創建但不響應項目點擊,尤其是那些設置為showAsAction="always"
。
最終發現問題是由invalidateOptionsMenu();
我在onCreateOptionsMenu(...)
方法中調用了它。
我改變了這個,它解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.