在创建新Activity时,为什么我们需要将EditText对象转换为EditText对象?

时间:2015-12-09 21:15:19

标签: java android xml

这是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

3 个答案:

答案 0 :(得分:3)

findViewById()默认返回View,但不包括getText()等方法。

EditTextView的子类,这就是此投射有效的原因。

java.lang.Object
   ↳    android.view.View
       ↳    android.widget.TextView
           ↳    android.widget.EditText

答案 1 :(得分:1)

方法findViewById会返回View,这是Android中任意视图的通用类。这意味着ListViewTextViewTabHost等等都是View s。

您必须强制转换它,以便您使用的对象可以访问View的特定方法。例如,ListView包含EditText没有的方法。

你可以毫无顾虑地投射它,因为你知道你正在使用的对象是确实一个EditText。您知道,因为您在编写布局时明确定义了EditText,并为此View分配了一个ID,稍后您将使用该ID来识别此完全相同的视图。

答案 2 :(得分:1)

你怎么知道它是EditText? Android如何知道它?

事实上,除非你这么说,否则Android会知道它,因为findViewById()的返回类型是View。虽然EditTextView中的一种,但还有其他类型,可以定义自定义的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); 来惩罚您。