我为菜单项创建了自定义布局。现在我需要它来点击时加载一个新的活动。代码逻辑如下:
资源中的菜单声明:
<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" />
活动由各个标签下的片段组成。
根据我在SO上收集的内容,我需要在片段内的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
}
}
问题如下:当点击操作栏中的菜单项时,它会相当&#34;随机&#34;。有时,它会在一次点击后生效,有时则会加载活动4次点击或3次点击。没有一次点击的一致性。什么似乎是问题?
答案 0 :(得分:1)
查看您的菜单项clickable应该为true或删除public enum Ordinals {
FIRST("st"),
SECOND("nd"),
THIRD("rd");
private String notation;
private Ordinals(String notation) {
this.notation = notation;
}
public String getNotation() {
return notation;
}
}
并删除android:clickable="fales"
,您的菜单项看起来像这样。
android:actionLayout="@layout/basket_notification_counter"
OR
<item android:id="@+id/shopping_cart"
android:title="cart"
android:icon="@drawable/ic_add_shopping_cart_white_24dp"
android:clickable="true"
app:showAsAction="always" />
答案 1 :(得分:0)
我的应用程序遇到了同样的问题。正在创建操作栏但未响应点击。我以前在该活动上有相对布局,我将其更改为线性布局,并将小部件的大小和方向调整为以前的样子。它解决了我的问题。试试看。希望它有所帮助:)
答案 2 :(得分:0)
问题是您的自定义菜单项布局。尝试为菜单添加自定义点击监听器
<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
}
希望有所帮助
答案 3 :(得分:0)
代替使用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}));
答案 4 :(得分:0)
因为活动的布局根目录GroupView可以阻止将点击事件发送到工具栏菜单项(如果您将CobarinatorLayout和Toolbar一起使用),则应尝试添加
col1
cat ind
dog uk
lion us
tiger + aus
到您的根GroupView
您还需要重写onOptionsItemSelected,如下所示(科特林版本):
android:focusable="false"
android:clickable="false"
即使不要使用它,也不要忘记将MenuItem作为参数传递给函数:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
super.onOptionsItemSelected(item)
when (item.itemId) {
R.id.menu_favorite -> {
handleFavorite(item)
}
}
return true
}
答案 5 :(得分:0)
上述解决方案可能不适用于谁,
确保您的<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,因此,如果要复制粘贴此代码,请小心。
答案 6 :(得分:0)
请在您的
中尝试一下onCreateOptionsMenu(menu: Menu, inflater: MenuInflater)
方法
科特琳
inflater.inflate(R.menu.my_menu, menu)
menu.findItem(R.id.my_custom_item).actionView.setOnClickListener {
println("КЛИК")
}
Java
inflater.inflate(R.menu.my_menu, menu)
findItem(R.id.my_custom_item).getActionView().setOnClickListener(v -> System.out.println("click");
对我有用
答案 7 :(得分:0)
遇到类似问题。创建了操作栏,但不响应项目单击,尤其是设置为invalidateOptionsMenu();
的项目。
最终发现问题是由onCreateOptionsMenu(...)
引起的
我在[
{
"internData": {
"id": "abc123",
"name": "Doctor"
},
"author": "Will smith",
"description": "Is an actor",
"url": "https://www",
},
{
"internData": {
"id": "qwe900",
"name": "Constructor"
},
"author": "Edd Bett",
"description": "Is an Constructor",
"url": "https://www3",
}
]
方法中调用的方法。
我对此进行了更改,并解决了该问题。