这是Android Studio Training的一部分。
EditText editText = (EditText) findViewById(R.id.edit_message);
完整的方法是:
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
}
有关此培训项目的更多信息,请访问: http://developer.android.com/training/basics/firstapp/starting-activity.html
答案 0 :(得分:3)
findViewById()
默认返回View
,但不包括getText()
等方法。
EditText
是View
的子类,这就是此投射有效的原因。
java.lang.Object
↳ android.view.View
↳ android.widget.TextView
↳ android.widget.EditText
答案 1 :(得分:1)
方法findViewById
会返回View
,这是Android中任意视图的通用类。这意味着ListView
,TextView
,TabHost
等等都是View
s。
您必须强制转换它,以便您使用的对象可以访问View
的特定方法。例如,ListView
包含EditText
没有的方法。
你可以毫无顾虑地投射它,因为你知道你正在使用的对象是确实一个EditText
。您知道,因为您在编写布局时明确定义了EditText
,并为此View
分配了一个ID,稍后您将使用该ID来识别此完全相同的视图。
答案 2 :(得分:1)
你怎么知道它是EditText
? Android如何知道它?
事实上,除非你这么说,否则Android会不知道它,因为findViewById()
的返回类型是View
。虽然EditText
是View
中的一种,但还有其他类型,可以定义自定义的View
。演员告诉Android,您保证返回的EditText
将是ClassCastException
,因此它可以将其视为一个。它要求你明确地部署以保护自己 - 这样你就知道自己正在将自己的知识/假设注入到程序中。
如果发现您的承诺有误,那么Android会抛出 app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create, (options, manager) =>
{
options.DataProtectionProvider = app.GetDataProtectionProvider();
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("AspNet.com"));
});
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
来惩罚您。