findViewById 即使使用 compileSdkVersion 30 也不接受类型参数

findViewById not accepting type argument even with compileSdkVersion 30

我通常将 kotlin 用于 android,但我的大学希望我使用 Java。所以我在 android studio 中创建了一个新的 java 项目。

问题是我不想手动转换 findViewById() 的 return 值。相反,我想将 EditText 作为函数未按预期接受的类型参数传递。我收到错误:

/home/onkar/AndroidStudioProjects/MyApplication2/app/src/main/java/io/github/omkar76/myapplication/MainActivity.java:16: error: cannot find symbol
        Log.d("EDITTEXT", findViewById<EditText>(R.id.first_name).getText());
                          ^
  symbol:   variable findViewById
  location: class MainActivity

为什么这不起作用?为什么找不到方法?我什至检查了 AppCompatActivity 的来源,它确实包含所需的方法:

 @Override
    public <T extends View> T findViewById(@IdRes int id) {
        return getDelegate().findViewById(id);
    }

我的 Java 代码是:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("EDITTEXT", findViewById<EditText>(R.id.first_name).getText());
    }
}

如果我不传递类型参数 EditText,findViewById returns View 然后我需要手动转换。根据 从 api 26 开始,您不需要转换 returned 值。我有 API 30 个 SDK。那么为什么这不起作用。我知道一些解决方法,例如将 return 值分配给 EditText 引用,但我的兴趣是了解为什么现有方法不起作用。

如果需要任何其他详细信息,请告诉我。请指出我做错了什么。谢谢!

使用变量名的最简单方法

EditText editext = findViewById(R.id.first_name);

那么你可以使用

 Log.d("EDITTEXT", editext.getText().toString());

实际上,Java 对于 findViewById.

没有像 Kotlin 这样的语法

Kotlin 语法:

findViewById<EditText>(R.id.first_name)

相当于Java:

(EditText)findViewById(R.id.first_name);

因此,您可以在 java 中这样做:

Log.d("EDITTEXT", ((EditText)findViewById(R.id.first_name)).getText().toString());

注意:你必须把 toString()EditableString 在 Java

中显式

我认为您对 java 的语法感到困惑。

此处public <T extends View> T findViewById(@ResId int id)表示:

return 值强制转换为 T,T 用等号前赋值声明的左侧解析。在下面的例子中

Edittext x = view.findViewById(R.id.abc)

所以这里 T 被分配为 Edittext,因为 Edittext 位于分配声明的左侧,然后 returns edittext 作为视图。然后你可以调用 x 来获取字符串。 希望这能让它更清楚