标签:功能 相同 响应 读取文本 edittext ppc empty sage create
完成上一课的学习后,您已构建了一个显示一个 Activity(单一屏幕)并带有一个文本字段和一个按钮的应用。 在本课中,您将为 MainActivity 添加一些代码,这些代码可在用户点击“Send”按钮时启动一个新的 Activity。
android:onClick 属性添加到 <Button> 元素,如下所示:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
每次用户点击按钮时,此属性均会提示系统调用 Activity 中的 sendMessage() 方法。
sendMessage() 方法存根,如下所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
}
要让系统将此方法与为 android:onClick 指定的方法名称匹配,签名必须与所示内容完全相同。具体而言,该方法必须:
接下来,您需要填写此方法以读取文本字段的内容,并将该文本传递给另一个 Activity。
Intent 是指在相互独立的组件(如两个 Activity)之间提供运行时绑定功能的对象。Intent 表示一个应用“执行某项操作的 Intent”。 您可以将 Intent 用于各种任务,但在本课程中,Intent 用于启动另一个 Activity。
在 MainActivity.java 中,将如下所示代码添加到 sendMessage():
public class MainActivity extends AppCompatActivity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/** Called when the user clicks the Send button */
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);
startActivity(intent);
}
}
Android Studio 将显示无法解析符号错误,这是因为此代码引用了未导入的类。 通过按 Alt + Enter(在 Mac 上,则按 Option + Return),您可使用 Android Studio 的“导入类”功能来解决其中一些问题。您的导入应按如下所示结束:
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText;
仍出现 DisplayMessageActivity 错误,但没关系,您将在下一部分中修复该错误。
sendMessage() 中会执行许多操作,因此我们来解释下具体会执行哪些操作。
Intent 构造函数采用两个参数:
Context 是第一个参数(之所以使用 this ,是因为 Activity 类是 Context 的子类)Class,系统应将 Intent(在本例中,为应启动的 Activity)传递至该类。
注:引用 DisplayMessageActivity 会在 Android Studio 中引发错误,因为该类尚不存在。可以暂时忽略该错误,因为您很快要创建该类。
putExtra() 方法将 EditText 的值添加到 Intent。Intent 能够以名为 extra 的键值对形式携带数据类型。您的键是一个公共常量 EXTRA_MESSAGE,因为下一个 Activity 将使用该键来检索文本值。为 Intent extra 定义键时最好使用应用的软件包名称作为前缀。这可以确保在您的应用与其他应用交互过程中这些键始终保持唯一。
startActivity() 方法将启动 Intent 指定的 DisplayMessageActivity 实例。现在,您需要创建类。
Android Studio 自动执行三项操作:
onCreate() 方法的实现创建类 DisplayMessageActivity.java。activity_display_message.xmlAndroidManifest.xml 中添加必需的 <activity> 元素。如果运行应用并在第一个 Activity 上点击“Send”按钮,则将启动第二个 Activity,但它为空。这是因为第二个 Activity 使用模板提供的默认空布局。
现在,您将修改第二个 Activity,以显示第一个 Activity 传递的消息。
DisplayMessageActivity.java 中,向 onCreate() 方法添加下列代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
ViewGroup layout = (ViewGroup) findViewById(R.id.activity_display_message);
layout.addView(textView);
}
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ViewGroup; import android.widget.TextView;
此处会执行大量操作,因此我们接着解释:
getIntent() 采集启动 Activity 的 intent。无论用户如何导航到目的地,每个 Activity 都由一个 Intent 调用。 调用 getStringExtra() 将检索第一个 Activity 中的数据。TextView 并设置其大小和消息。TextView 添加到 R.id.activity_display_message 标识的布局。您可将布局投射到 ViewGroup,因为它是所有布局的超类且包含 addView() 方法。注:早期版本的 Android Studio 生成的 XML 布局可能不包括 android:id 属性。如果布局没有 android:id 属性,则调用 findViewById() 将失败。如果出现这种情况,请打开 activity_display_message.xml 并将属性 android:id="@+id/activity_display_message" 添加到布局元素。
您现在便可运行该应用。当应用打开后,请在文本字段键入消息,然后点击 Send。第二个 Activity 将替换屏幕中的第一个 Activity,并显示您在第一个 Activity 中输入的消息。
就这么简单,您的第一个 Android 应用已成功诞生!
如需了解详细信息,请点击下方链接进入下一课。
标签:功能 相同 响应 读取文本 edittext ppc empty sage create
原文地址:http://www.cnblogs.com/youseiraws/p/7015624.html