在我的应用程序中,我有一个微调器,用户用电话号码填充它。
用户有3个选项:添加 - 编辑 - 删除。用于显示我使用popupMenu
的选项。
因此,在旋转器处于空白状态时,选项编辑&启用删除(在xml文件中定义), 但是在将项目添加到微调器后,我希望启用的选项可用,以便用户可以选择它们。
我尝试了一些我找到的代码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>
答案 0 :(得分:1)
您已多次声明PopupMenu
弹出窗口。一次全局位于课程顶部,第二次位于ShowMenu
本地。所以你有两个弹出对象。
您充气并显示在ShowMenu
中创建的本地弹出菜单。在ShowAlertDialog
中,代码使用全局声明的弹出窗口,该弹出窗口没有附加的膨胀视图。
从PopupMenu
中的语句中删除classtype ShowMenu
。
其次,在ShowAlertDialog
中,您没有从弹出对象(弹出菜单)中获取Menu对象,而是将其分配给popupMenu对象(类型为Menu
)。因此,您的setEnabled
代码不执行任何操作。
popupMenu = popup.getMenu();
编码时应使用Eclipse等IDE。它将标记所有这些错误。
答案 1 :(得分:0)
一开始我定义了编辑&amp;删除 spinner_action.xml
中的选项 to: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);
}
});
}
并且用户第一次填充微调器后,他可以再次显示popupMenu并选择其他选项。但是当用户点击按钮显示popupMenu这个代码将被执行时,这是错误的:
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"
取消了showAlertDialog()
中的操作。
为了解决这个问题,我做了以下简单的改变:
在showPopup
我检查了adapter.getCount
- 如果等于0
(表示 - 在<微调器中没有 项目)所以我应该启用编辑&amp;删除选项,但如果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();
}