java - 即使使用 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
引用之类的解决方法,但我的兴趣是知道为什么存在方法不起作用。
让我知道是否需要任何其他详细信息。请指出我做错了什么。谢谢!
解决方案
我认为您对 java 的语法感到困惑。
这里的public <T extends View> T findViewById(@ResId int id)
意思是:
返回值强制转换为 T,T 在赋值声明的左侧在等号之前解析。在下面的例子中
Edittext x = view.findViewById(R.id.abc)
所以这里 T 被分配为 Edittext,因为 Edittext 位于赋值声明的左侧,然后将 edittext 作为视图返回。然后你可以调用 x 来获取字符串。希望这能让它更清楚
推荐阅读
- android - 使用cordova android build加载socket.io
- bash - du:如果符号链接指向外部目录,则跟随符号链接,否则不要跟随
- javascript - 如何将内部属性添加到附加标签元素(从firebase数据库附加数据到表)?
- python - 为什么提高精度会使这个程序更快?
- python - 当我在一组中切换顺序时,为什么我的代码会采用不同的值(知道顺序与组无关)
- r - 术语文档矩阵似乎结合了单词?“sootawn”“能力刷”
- python - 将定位器与页面对象类分离 Python Selenium
- intellij-idea - 如何在 Intellij IDE 中拥有一个包含所有搜索选项的搜索面板?
- git - Git 子模块在从私有 git 服务器克隆时无法递归
- arrays - MongoDB如何通过匹配多个对象值来查询嵌套对象数组?