Java 语法解释 - getMenuInflater()

3

我刚刚下载了Android Studio,正在使用《大脑斧牧场的Android编程指南》学习。

当你启动Android Studio时,主活动文件中已经有了这段代码:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    **getMenuInflater().inflate(R.menu.menu_quiz, menu);**
    return true;
}

我不理解 getMenuInflater 这一行。在我短暂的Java经验中,只有在使用句点分隔两者时,才会在方法之前放置一个对象,例如 dog.bark()。这里看起来像是调用定义在 getMenuInflater 方法内部的 inflate 方法。然而,我检查了 getMenuInflater() 的源代码,发现它的主体中没有 inflate 方法。
请问有人能为我揭开这行代码的语法之谜吗?

getMenuInflater() 返回一个对象,因此您可以使用它而不是一个对象。 - Chris
有趣的是...那可能是最好的解释。谢谢! - user4980063
5个回答

4

getMenuInflater().inflate(R.menu.menu_quiz, menu);这一行代码是以下代码的简写形式:

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_quiz, menu)

现在我有另一个问题。如何将对象引用变量设置为方法的值?例如:MenuInflater inflater=getMenuInflater() - user4980063
1
你正在设置调用getMenuInflater()方法的结果,而不是设置一个方法。在这种情况下,它返回一个MenuInflater对象。 - isma3l

2

您正在扩展一个活动,Android Studio会自动添加该行以配置布局的菜单,下面是活动类中该方法的实际实现:

 public MenuInflater getMenuInflater() {
            // Make sure that action views can get an appropriate theme.
            if (mMenuInflater == null) {
                initWindowDecorActionBar();
                if (mActionBar != null) {
                    mMenuInflater = new MenuInflater(mActionBar.getThemedContext(), this);
                } else {
                    mMenuInflater = new MenuInflater(this);
                }
            }
            return mMenuInflater;
        }

哦...inflate(R.menu.menu_quiz, menu)在这一切中扮演了什么角色呢? - user4980063
你可以像填充 XML 布局一样填充菜单,将菜单项添加到 /menu 文件夹下的 XML 中。 - rahul.ramanujam

1

我不太确定你对什么感到困惑,但我认为你认为在对象名称后始终需要调用方法。这基本上是正确的(除了静态方法),因此您可以将调用视为

this.getMenuInflater()

这是Java中的一个关键字,指代调用方法的当前对象。

1
抱歉,我知道答案已被接受。
但是,我认为我可以提供一些见解并获得一些健康的批评:

MenuInflater是一个Android系统资源。它在android启动时创建。它是一个持久化对象,并且对它的引用始终可用于内存中。
每个Context类的子类,即Activity,在您的情况下,都可以通过调用以下方式获取对它的引用:
  1. getMenuInflater()从该类(例如:Context)或任何其子类(例如:Activity)中
  2. <any_context_object>.getMenuInflater()从类外部。

内部:

getMenuInflater()检查是否存在MenuInflater对象,然后:
  • 如果它存在于内存中,则返回该对象。
  • 否则,它将创建一个并返回它。
它被称为单例设计模式,确保只创建一个类的实例。这样做可以重用旧对象的状态,并在多个进程之间共享该状态,而无需显式地将其传递给它们。
因此,Android Runtime创建一个MenuInflater对象,应用程序可以通过调用上下文对象定义的getMenuInflater()方法来请求它。
public MenuInflater getMenuInflater() {
    // Make sure that action views can get an appropriate theme.
    if (mMenuInflater == null) {
        initWindowDecorActionBar();
        if (mActionBar != null) {
            mMenuInflater = new MenuInflater(mActionBar.getThemedContext(), this);
        } else {
            mMenuInflater = new MenuInflater(this);
        }
    }
    return mMenuInflater;
}

0

这将会自动在Res文件夹中创建一个名为menu.xml的菜单。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >


<item android:id="@+id/slideshowbutton"
      android:icon="@drawable/settings"
      android:title="@string/settings"/>

<item android:id="@+id/editbutton"
      android:icon="@drawable/adduser"
      android:title="@string/adduser"/>

<item android:id="@+id/cropbutton"
      android:icon="@drawable/message"
      android:title="@string/message"/>

<item android:id="@+id/detailsbutton"
      android:icon="@drawable/logout"
      android:title="@string/Logout"/>

你可以根据需要添加菜单列表
菜单将像这样: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接