弹出菜单项中的 SetEnabled(true) 不起作用
SetEnabled(true) in Popup Menu items is not working
在我的应用程序中,我有一个微调器,用户可以在其中填充 phone 个数字。
用户有 3 个选项:添加 - 编辑 - 删除。为了显示我使用的选项 popupMenu
。
所以,在开始时当微调器为空时,选项 Edit & Delete 被启用(定义在 xml 文件),
但是在将项目添加到微调器之后,我希望启用的选项可用,以便用户可以 select 它们。
我尝试了一些找到的代码 here 但它不起作用。
下面是我的完整代码。
谢谢!!!
MainActivity.java
public class EachApartInList extends ActionBarActivity implements OnMenuItemClickListener{
Spinner spinner;
ArrayAdapter<String> adapter;
Menu popupMenu;
PopupMenu popup;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.each_apart_in_list);
spinner =(Spinner)findViewById(R.id.spinner1);
adapter = new ArrayAdapter<String>(
getBaseContext(), android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
public void ShowMenu(View v){
PopupMenu popup = new PopupMenu(this, v);
// This activity implements OnMenuItemClickListener
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem arg0) {
int id;
switch(id = arg0.getItemId()){
case R.id.menu_add:
showAlertDialog();
break;
case R.id.menu_edit:
break;
case R.id.menu_delete:
break;
}
// TODO Auto-generated method stub
return false;
}
void showAlertDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final EditText phoneNum = new EditText(this);
phoneNum.setInputType(InputType.TYPE_CLASS_PHONE);
builder.setView(phoneNum)
.setTitle("Add number")
.setMessage("Enter the number here :");
// Set up the buttons
builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newPhoneNum = phoneNum.getText().toString();
adapter.add(newPhoneNum);
adapter.notifyDataSetChanged();
popupMenu.findItem(R.id.menu_edit).setEnabled(true);
popupMenu.findItem(R.id.menu_delete).setEnabled(true);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
spinner_action.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_add"
android:icon="@drawable/app_icon"
android:title="add"/>
<item
android:id="@+id/menu_edit"
android:enabled="false"
android:title="edit"/>
<item
android:id="@+id/menu_delete"
android:enabled="false"
android:title="delete"/>
</menu>
您已多次声明 PopupMenu
弹出窗口。一次全局位于 class 的顶部,第二次位于 ShowMenu
的局部。所以你有两个弹出对象。
您膨胀并显示在 ShowMenu
中创建的本地弹出菜单。在 ShowAlertDialog
中,代码与全局声明的弹出窗口一起使用,该弹出窗口没有附加膨胀视图。
从 ShowMenu
中的语句中删除 class 类型 PopupMenu
。
其次,在ShowAlertDialog
中,您没有从弹出对象(弹出菜单)中获取Menu对象并将其分配给popupMenu对象(Menu
类型)。因此,您的 setEnabled
代码什么都不做。
popupMenu = popup.getMenu();
您应该在编码时使用 IDE,例如 Eclipse。它将标记所有这些错误。
一开始我在spinner_action.xml
中定义了edit&delete选项
到 : android:enabled ="false"
并且我尝试在 showAlertDialog()
方法中以编程方式更改它们:
void showAlertDialog(){
.
.
.
builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
popupMenu.findItem(R.id.menu_edit).setEnabled(true);
popupMenu.findItem(R.id.menu_delete).setEnabled(true);
}
});
}
并且在用户第一次填充微调器后他可以再次显示弹出菜单和select其他options.But这是用户点击显示弹出菜单的按钮时的错误代码将被执行:
public void ShowMenu(View v){
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
popup.show();
}
并且该函数显示 spinner_actio.xml 中的原始项目及其原始设置,因此定义 android:enabled ="false"
取消了在 [=14= 中完成的操作].
为了解决这个问题,我做了以下简单的更改:
在 showPopup
我检查了 adapter.getCount
- 如果等于 0
( 意味着 - 没有 项目微调器 ) 所以我应该启用 编辑和删除 选项,但是如果 adapter.getCount
大于 0
- 我设置 enabled
到 true
,现在这些项目可用。
这是我的最终 ShowMenu()
代码:
public void ShowMenu(View v){
popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
Menu popupMenuItems = popup.getMenu();
if(adapter.getCount() == 0){
popupMenuItems.findItem(R.id.menu_edit).setEnabled(false);
popupMenuItems.findItem(R.id.menu_delete).setEnabled(false);
}
else{
popupMenuItems.findItem(R.id.menu_edit).setEnabled(true);
popupMenuItems.findItem(R.id.menu_delete).setEnabled(true);
}
popup.show();
}
在我的应用程序中,我有一个微调器,用户可以在其中填充 phone 个数字。
用户有 3 个选项:添加 - 编辑 - 删除。为了显示我使用的选项 popupMenu
。
所以,在开始时当微调器为空时,选项 Edit & Delete 被启用(定义在 xml 文件), 但是在将项目添加到微调器之后,我希望启用的选项可用,以便用户可以 select 它们。
我尝试了一些找到的代码 here 但它不起作用。
下面是我的完整代码。 谢谢!!!
MainActivity.java
public class EachApartInList extends ActionBarActivity implements OnMenuItemClickListener{
Spinner spinner;
ArrayAdapter<String> adapter;
Menu popupMenu;
PopupMenu popup;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.each_apart_in_list);
spinner =(Spinner)findViewById(R.id.spinner1);
adapter = new ArrayAdapter<String>(
getBaseContext(), android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
public void ShowMenu(View v){
PopupMenu popup = new PopupMenu(this, v);
// This activity implements OnMenuItemClickListener
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem arg0) {
int id;
switch(id = arg0.getItemId()){
case R.id.menu_add:
showAlertDialog();
break;
case R.id.menu_edit:
break;
case R.id.menu_delete:
break;
}
// TODO Auto-generated method stub
return false;
}
void showAlertDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final EditText phoneNum = new EditText(this);
phoneNum.setInputType(InputType.TYPE_CLASS_PHONE);
builder.setView(phoneNum)
.setTitle("Add number")
.setMessage("Enter the number here :");
// Set up the buttons
builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newPhoneNum = phoneNum.getText().toString();
adapter.add(newPhoneNum);
adapter.notifyDataSetChanged();
popupMenu.findItem(R.id.menu_edit).setEnabled(true);
popupMenu.findItem(R.id.menu_delete).setEnabled(true);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
spinner_action.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_add"
android:icon="@drawable/app_icon"
android:title="add"/>
<item
android:id="@+id/menu_edit"
android:enabled="false"
android:title="edit"/>
<item
android:id="@+id/menu_delete"
android:enabled="false"
android:title="delete"/>
</menu>
您已多次声明 PopupMenu
弹出窗口。一次全局位于 class 的顶部,第二次位于 ShowMenu
的局部。所以你有两个弹出对象。
您膨胀并显示在 ShowMenu
中创建的本地弹出菜单。在 ShowAlertDialog
中,代码与全局声明的弹出窗口一起使用,该弹出窗口没有附加膨胀视图。
从 ShowMenu
中的语句中删除 class 类型 PopupMenu
。
其次,在ShowAlertDialog
中,您没有从弹出对象(弹出菜单)中获取Menu对象并将其分配给popupMenu对象(Menu
类型)。因此,您的 setEnabled
代码什么都不做。
popupMenu = popup.getMenu();
您应该在编码时使用 IDE,例如 Eclipse。它将标记所有这些错误。
一开始我在spinner_action.xml
中定义了edit&delete选项 到 : android:enabled ="false"
并且我尝试在 showAlertDialog()
方法中以编程方式更改它们:
void showAlertDialog(){
.
.
.
builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
popupMenu.findItem(R.id.menu_edit).setEnabled(true);
popupMenu.findItem(R.id.menu_delete).setEnabled(true);
}
});
}
并且在用户第一次填充微调器后他可以再次显示弹出菜单和select其他options.But这是用户点击显示弹出菜单的按钮时的错误代码将被执行:
public void ShowMenu(View v){
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
popup.show();
}
并且该函数显示 spinner_actio.xml 中的原始项目及其原始设置,因此定义 android:enabled ="false"
取消了在 [=14= 中完成的操作].
为了解决这个问题,我做了以下简单的更改:
在 showPopup
我检查了 adapter.getCount
- 如果等于 0
( 意味着 - 没有 项目微调器 ) 所以我应该启用 编辑和删除 选项,但是如果 adapter.getCount
大于 0
- 我设置 enabled
到 true
,现在这些项目可用。
这是我的最终 ShowMenu()
代码:
public void ShowMenu(View v){
popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.spinner_action);
Menu popupMenuItems = popup.getMenu();
if(adapter.getCount() == 0){
popupMenuItems.findItem(R.id.menu_edit).setEnabled(false);
popupMenuItems.findItem(R.id.menu_delete).setEnabled(false);
}
else{
popupMenuItems.findItem(R.id.menu_edit).setEnabled(true);
popupMenuItems.findItem(R.id.menu_delete).setEnabled(true);
}
popup.show();
}