Java 菜单抽屉中的参考菜单项
Reference menu item in Java menu drawer
我希望能够引用抽屉中的菜单项并更新其标题。我不确定为什么我不能这样做,但每次我尝试时它都说我的菜单项 object 是空 object 引用并且它使应用程序崩溃。
xml 文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_testItem"
android:icon="@drawable/ic_test_icon"
android:title="Test Title" />
</group>
</menu>
代码:
public class myClass {
private DrawerLayout mDrawerLayout;
private MenuItem testMenuItem;
protected void onCreate() {
mDrawerLayout = findViewById(R.id.drawer_layout);
testMenuItem = mDrawerLayout.findViewById(R.id.nav_testItem);
final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
menuItem.setChecked(true);
switch (menuItem.getItemId()) {
case R.id.nav_testItem:
AlertDialog.Builder builderL = new AlertDialog.Builder(myClass.this);
builderL.setTitle("Set Test Value");
builderL.setPositiveButton("Set", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
foo = inputL.getText().toString();
testMenuItem.setTitle(foo);
}
builderL.show();
break;
}
无论我尝试什么,或者我尝试将 setTitle 代码移动到哪里,testMenuItem 始终为空并且应用程序崩溃。相比之下,我在它下面有另一个菜单项,我不需要接受来自用户的任何类型的输入,它只是一个 on/off 切换。这工作得很好:
case R.id.nav_ghost:
menuItem.setTitle("Ghost Mode Disabled");
break;
只是因为我首先需要用户的输入,所以我根本无法引用该项目。如果我尝试非常简单的方法:
case R.id.nav_testItem:
Get String from user;
menuItem.setTitle(StringFromUser);
break;
然后它永远不会真正触发 setTitle 部分,因为愚蠢的异步问题尚未填充字符串。
让我最头疼的总是任何应用程序中最简单的部分:(
也许foo = builderL.getText().toString();
可以解决您的问题
而不是foo = inputL.getText().toString();
但如果你是故意这样做的,我看不到你在哪里创建对象 inputL
试试这个。
switch (menuItem.getItemId())
{
case R.id.nav_testItem:
AlertDialog.Builder builderL = new AlertDialog.Builder(myClass.this);
builderL.setTitle("Set Test Value");
View v=LayoutInflator.from(context).inflate(R.layout.your_custom_view,null);
builderL.setView(v);
EditText et1=v.findViewById(R.id.et_1);
builderL.setPositiveButton("Set", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
foo = et1.getText().toString();
testMenuItem.setTitle(foo);
dialog.dismiss();
}
builderL.show();
break;
}
解决方法是我从未告诉应用程序 testMenuItem 是刚刚单击的项目的值。无论出于何种原因,如果我声明它并将其指向 xml 引用,它根本不起作用。编译器只是 deeeerp。
所以要解决这个问题:
testMenuItem = menuItem;
testMenuItem.setTitle("Success!");
我希望能够引用抽屉中的菜单项并更新其标题。我不确定为什么我不能这样做,但每次我尝试时它都说我的菜单项 object 是空 object 引用并且它使应用程序崩溃。
xml 文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_testItem"
android:icon="@drawable/ic_test_icon"
android:title="Test Title" />
</group>
</menu>
代码:
public class myClass {
private DrawerLayout mDrawerLayout;
private MenuItem testMenuItem;
protected void onCreate() {
mDrawerLayout = findViewById(R.id.drawer_layout);
testMenuItem = mDrawerLayout.findViewById(R.id.nav_testItem);
final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
menuItem.setChecked(true);
switch (menuItem.getItemId()) {
case R.id.nav_testItem:
AlertDialog.Builder builderL = new AlertDialog.Builder(myClass.this);
builderL.setTitle("Set Test Value");
builderL.setPositiveButton("Set", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
foo = inputL.getText().toString();
testMenuItem.setTitle(foo);
}
builderL.show();
break;
}
无论我尝试什么,或者我尝试将 setTitle 代码移动到哪里,testMenuItem 始终为空并且应用程序崩溃。相比之下,我在它下面有另一个菜单项,我不需要接受来自用户的任何类型的输入,它只是一个 on/off 切换。这工作得很好:
case R.id.nav_ghost:
menuItem.setTitle("Ghost Mode Disabled");
break;
只是因为我首先需要用户的输入,所以我根本无法引用该项目。如果我尝试非常简单的方法:
case R.id.nav_testItem:
Get String from user;
menuItem.setTitle(StringFromUser);
break;
然后它永远不会真正触发 setTitle 部分,因为愚蠢的异步问题尚未填充字符串。
让我最头疼的总是任何应用程序中最简单的部分:(
也许foo = builderL.getText().toString();
可以解决您的问题
而不是foo = inputL.getText().toString();
但如果你是故意这样做的,我看不到你在哪里创建对象 inputL
试试这个。
switch (menuItem.getItemId())
{
case R.id.nav_testItem:
AlertDialog.Builder builderL = new AlertDialog.Builder(myClass.this);
builderL.setTitle("Set Test Value");
View v=LayoutInflator.from(context).inflate(R.layout.your_custom_view,null);
builderL.setView(v);
EditText et1=v.findViewById(R.id.et_1);
builderL.setPositiveButton("Set", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
foo = et1.getText().toString();
testMenuItem.setTitle(foo);
dialog.dismiss();
}
builderL.show();
break;
}
解决方法是我从未告诉应用程序 testMenuItem 是刚刚单击的项目的值。无论出于何种原因,如果我声明它并将其指向 xml 引用,它根本不起作用。编译器只是 deeeerp。
所以要解决这个问题:
testMenuItem = menuItem;
testMenuItem.setTitle("Success!");