首页 > 解决方案 > 即使使用 compileSdkVersion 30,findViewById 也不接受类型参数

问题描述

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

问题是我不想findViewById()手动转换返回值。相反,我想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 返回View,然后我需要手动转换。根据这篇从 api 26 开始的帖子,您不需要转换返回值。我有 API 30 SDK。那么为什么这不起作用。我知道诸如将返回值分配给EditText引用之类的解决方法,但我的兴趣是知道为什么存在方法不起作用。

让我知道是否需要任何其他详细信息。请指出我做错了什么。谢谢!

标签: javaandroidfindviewbyid

解决方案


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

这里的public <T extends View> T findViewById(@ResId int id)意思是:

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

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

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


推荐阅读