【问题标题】:Java syntax explanation - getMenuInflater()Java 语法解释——getMenuInflater()
【发布时间】:2015-08-21 01:53:09
【问题描述】:

刚刚下载了android studio,我正在使用big nerd ranch 的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() 返回一个对象,因此您可以使用它来代替对象
  • 有趣...这可能对我来说是最好的。谢谢!!

标签: java android syntax


【解决方案1】:

您正在扩展一个活动,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) 在哪里发挥作用?
  • 你膨胀菜单就像你用 xml 布局膨胀活动一样,你通过 /menu 文件夹下的 xml 添加菜单项
【解决方案2】:

getMenuInflater().inflate(R.menu.menu_quiz, menu); 行是它的缩写:

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

【讨论】:

  • 大声笑现在我还有一个问题。你如何设置一个对象引用变量等于一个方法?比如在MenuInflater inflater=getMenuInflater()
  • 你不是在设置一个方法,你是在设置调用getMenuInflater()方法的结果,在这个例子中是一个MenuInflater对象
【解决方案3】:

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

<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"/>

您可以根据需要添加菜单列表

菜单看起来像

【讨论】:

    【解决方案4】:

    我不太确定您对什么感到困惑,但我相信您认为您必须始终在对象名称之后进行方法调用。基本上是这样,(静态方法除外)所以你可以把调用想象成

    this.getMenuInflater()
    

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

    【讨论】:

      【解决方案5】:

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

      MenuInflater 是一个Android 系统资源。它是在 android 启动时创建的。它是一个持久对象,并且对它的引用始终在内存中可用。
      Context 类的每个子类,即Activity 在您的情况下,可以通过调用获取对它的引用:

      1. getMenuInflater() 来自类(例如:Context)或其任何子类(例如:Activity
      2. &lt;any_context_object&gt;.getMenuInflater() 来自课外。

      内部:

      getMenuInflater() 检查内存中是否存在 MenuInflater 对象,然后:

      • 如果内存中确实存在,则返回该对象。
      • 否则,它会创建一个并返回它。它的行为类似于 Java 工厂方法
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        相关资源
        最近更新 更多