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() 从 Editable 到 String 在 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 来获取字符串。
希望这能让它更清楚
我通常将 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
然后我需要手动转换。根据 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() 从 Editable 到 String 在 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 来获取字符串。 希望这能让它更清楚