【问题标题】:Android: IntelliJ IDEA 12.1 Parameter view never usedAndroid:从未使用过 IntelliJ IDEA 12.1 参数视图
【发布时间】:2013-04-02 08:31:36
【问题描述】:

请解释一下,为什么 IntelliJ IDEA 显示参数从未使用过?

 public void onClick(View view) { // Parameter 'view' never used
    Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show();
}

<ToggleButton
    ...
    android:onClick="onClick"/>

但我知道,如果我删除这个从未使用过的参数(视图),Android 会抛出运行时异常。

为什么 IntelliJ IDEA v12.1 显示此类警告但 Eclipse 不显示。 如何配置 IntelliJ IDEA 以隐藏所有 Android 项目的此类警告?

【问题讨论】:

    标签: java android eclipse intellij-idea


    【解决方案1】:

    因为您从不在方法onClick 中使用参数view。但是这个method的默认签名。

    例如,如果您将在方法中使用参数,IntelliJ IDEA 不会显示“Parameter never used”

    public void onClick(View view) { // Parameter 'view' used
    if(view.getId() == R.id.myId)  //example start
    {
        Toast.makeText(this, "CorrectId", Toast.LENGTH_LONG).show();
    }                             //example finish
    Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show();
    }
    

    更新:

    例如,您在主布局中有 3 个按钮:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/my_switcher"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    
    <Button
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/btn1"
            android:onClick="onClick"
            />
    <Button
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/btn2"
            android:onClick="onClick"
            />
    <Button
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/btn3"
            android:onClick="onClick"
            />
    
    </LinearLayout>
    

    我您的活动方法是 onClick 处理来自三个按钮的事件。并且我们需要识别该按钮已被按下。

     public void onClick(View view) { // Parameter 'view' used
        switch (view.getId())
        {
            case (R.id.btn1):
            {
                Toast.makeText(this, "Hello Button_1 pressed", Toast.LENGTH_LONG).show();
                break;
            }
            case (R.id.btn2):
            {
                Toast.makeText(this, "Hello Button_2 pressed", Toast.LENGTH_LONG).show();
                break;
            }
            case (R.id.btn3):
            {
                Toast.makeText(this, "Hello Button_2 pressed", Toast.LENGTH_LONG).show();
                break;
            }
        }
    

    这是如何使用“视图”的一个示例

    【讨论】:

    • 我知道,但例如 eclipse 并没有警告它。是否可以配置 IntelliJ IDEA 以隐藏所有 android 项目的此类警告?
    • 是的,检查this answer
    • 这只是一个警告,你没有忘记任何东西。这应该得到尊重。 IDE 尊重你!
    • 我不想使用视图参数,我只想向用户展示一个 Toast,为什么放 if else 语句很傻。
    • 我写了这段代码,是为了表明如果你在方法'view'中使用,那么ide不会发誓。只需使用您的代码 - 他一切都好。但是如果多了几个控件会用同样的方法Handle Charging,那你就得对比他的id,才能明白要采取什么行动。
    【解决方案2】:

    您会看到此警告,因为默认情况下会启用 未使用的符号 检查并配置为显示任何未使用的参数。虽然在这种特定情况下这不是问题,但它可以帮助您在其他情况下跟踪错误(例如,当您使用具有相似名称的局部变量时,因为拼写错误而不是实际的方法参数)。

    此检查提供了许多选项,您可以根据需要对其进行调整,例如通过禁用 Check Parameters 选项。或者您可以定义像 @Unused 这样的注解,这样 IDE 将忽略带有这些注解的任何参数,或者您可以从 Alt+Enter 菜单中取消此检查,向右箭头子菜单(禁止类/方法/语句,编辑检查设置或完全禁用它)。

    【讨论】:

      【解决方案3】:

      我认为更改警告设置不是最好的解决方案。

      您可以尝试以下代码:

      public void onClick(@SuppressWarnings("UnusedParameters")View ignored) { // Parameter 'ignored' never used
          Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show();
      }
      

      【讨论】:

      • 自 2021 年起,最好使用 @SuppressWarnings({"unused", "RedundantSuppression"}) 以避免 RedundantSuppression lint。
      【解决方案4】:

      对于 Kotlin,使用这句话来抑制这个警告:

      fun onClick(@Suppress("UNUSED_PARAMETER")view: View) {
      
      }
      

      【讨论】:

      • 压制真的是答案吗?如果按照 lint 的建议将值替换为“_”会怎样?
      • 目前,从 Android Studio 3.5 开始,使用丢弃 ("") 会导致编译错误:“, __, ___ are reserved names in kotlin”(格式已损坏)
      • 为了将来参考,我觉得@mgueydan 给出的答案是一种更好的方法来处理这个问题,而不是压制它,变成一个简单的测试来提高可维护性
      【解决方案5】:

      上面所说的一切都是伟大而真实的。这是另一种查看方式:

      起初我并没有看到需要使用这个参数。这是因为,在我正在处理的应用程序中,只有一个视图(可能是按钮)调用此 OnClick 回调。

      也就是说,不需要检查参数。只有一个按钮,一定是它。

      所以我感到困惑、愤怒或悲伤:

      • API 需要参数,
      • IDE 抱怨参数未使用。

      ...

      但我们可以用另一种方式来看待它:

      无需检查参数。只有一个按钮,一定是它

      我的项目中没有任何东西可以确保前面的陈述。今天可能是正确的,但在项目后期可能会变得不正确。它也可能因错误或意外而不真实。一个简单的错误。

      如果开发人员希望应用程序易于维护,他会怎么做?他检查或确保他想要真实的事实。

      所以我选择让这个警告消失的方式是:

      fun start_sync(button : View){
          assert(button.id == R.id.my_only_button)
          //...
      }
      

      最后,IDE 和 API 都是对的,错误是假设我不需要这个参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-14
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        相关资源
        最近更新 更多