7. Activity之间的信息传递
-
使⽤ Intent 在 Activity 之间传递数据;
-
使⽤显式 Intent 启动 Activity ;
要将 MainActivity 中 EditText ⽤户输⼊的消息传递给 MessageActivity ,我们需要在 Send Message 按钮点击事件侦听器中使⽤ Intent 启 动 MessageActivity 活动。
启动 Activity 可以使⽤ startActivity ⽅法,该⽅法接受⼀个 Intent(意图)参数。其 Intent 可以为 隐式 Intent 及显式 Intent,在本例中使⽤显式Intent ⽅式启动 MessageActivity ,如代码2.5。为了将 EditText 中⽤户输⼊的消息传递给 MessageActivity ,我们使⽤ Intent 对象中的putExtra()⽅法,该⽅法接收 key-value(键值对)形式的参数。
要在 MessageActivity 中取出启动该 Activity 时传⼊的 Message 值,需要getIntent()⽅法,该⽅法取得启动 Activity 的 Intent 对象,再使⽤ Intent 对象的getStringExtra()⽅法取得传⼊的 Message 值,如代码2.6所⽰。
mainActivity.java
public class MainActivity extends AppCompatActivity {
public static final String MESSAGE_STRING = "com.example.code04.MESSAGE";//有点不懂是什么意思
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etmessage = findViewById(R.id.message);
Button sendButton = findViewById(R.id.send_message);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = etmessage.getText().toString();
Intent intent = new Intent(MainActivity.this,MessageActivity.class);
intent.putExtra(MESSAGE_STRING,message);
startActivity(intent);
}
});
}
}
messageActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
TextView tvmessage = findViewById(R.id.tvmessage);
Intent intent = getIntent();
String meaasge = intent.getStringExtra(MainActivity.MESSAGE_STRING);
if(meaasge!=null){
if(tvmessage!=null){
tvmessage.setText(meaasge);
}
}
}
8. intent.putExtra()方法参数详解(显式表示)
putExtra("A",B)中,AB为键值对,第一个[参数]为键名,第二个参数为键对应的值。顺便提一下,如果想取出[Intent]对象中的这些值,需要在你的另一个Activity中用getXXXXXExtra[方法],注意需要使用对应类型的方法,参数为键名
例子:
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*取得输入框中的内容*/
String et1Str = et1.getText().toString();
String et2Str = et2.getText().toString();
//创建Intent对象,参数分别为上下文,要跳转的Activity类
Intent intent = ``new` `Intent(MyIntent.``this``, SecondActivity.``class``);
//将要传递的值附加到Intent对象
intent.putExtra(``"et1"``, et1Str);
intent.putExtra(``"et2"``, et2Str);
//启动该Intent对象,实现跳转
startActivity(intent);
`}
});
tv = (TextView) findViewById(R.id.tv);
//取得启动该Activity的Intent对象
Intent intent =getIntent();
/*取出Intent中附加的数据*/
String first = intent.getStringExtra(``"et1"``);
String second = intent.getStringExtra(``"et2"``);
//计算得到结果
int` `result = Integer.parseInt(first) + Integer.parseInt(second);
//设置TextView显示的文本
tv.setText(``"计算结果为:"``+String.valueOf(result));
9. 标签之间结束描述标志/
第一中形式,以</activity>为结束标志
<activity
android:name=".MessageActivity"
android:exported="false" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
第二种,直接结束
<activity
android:name=".MessageActivity"
android:exported="false" />
10. AndroidManiFest.xml是什么
##/11. 显式Intent与隐式Intent的使用与差别
-
区别
-
显示Intent指通过Intent启动指定的应用组件,通常是应用显示意图指通过意图启动指定的应用组件,通常是应用 内部的Activity 或Service。要创建显示Intent, 需要在Intent内部的Activity或Service 26。要创建显示意图,需要在意图对象中指定所需启动的组件名即可(其他Intent 属性都是可选)。对象中指定所需启动的组件名即可(其他意图属性都是可选)。
-
隐式Intent通过指定action的方式调用安装在本机的其他应用组件。当应用本身无法实现某一action 时,通过隐 式Intent可以很好的扩展应用的功能。
如果系统无法找到其他应用组件或由于权限限制的原因无法 响应处理你的Intent, startActivity ()调用失败,从而造成应用崩 溃。可以通过如下形式解决该问题:
-
-
使用
显式
(1)MainActivity中
String message = etmessage.getText().toString(); Intent intent = new Intent(MainActivity.this,MessageActivity.class); intent.putExtra(MESSAGE_STRING,message); startActivity(intent);
(2)另一个activity中
TextView tvmessage = findViewById(R.id.tvmessage);
Intent intent = getIntent();
String meaasge = intent.getStringExtra(MainActivity.MESSAGE_STRING);
if(meaasge!=null){
if(tvmessage!=null){
tvmessage.setText(meaasge);
}
}
隐式
(1)在MainActivity中
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,message);
sendIntent.setType("text/plain");
if(sendIntent.resolveActivity(getPackageManager())!=null){
startActivity(sendIntent);
}
(2)在androidManifest.xml中添加
<activity
android:name=".MessageActivity"
android:exported="false" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
(3)另一个Activity中跟显式一样
12. 图片在父容器(线性布局)中居中设置
通过设置 ImageView 的 **android:layout_centerInParent** 属性可以 ImageView 在其⽗容器中居中。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<ImageView
android:layout_width="108dp"
android:layout_height="108dp"
android:src="@mipmap/ic_logo"//图片源
android:layout_marginTop="48dp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
显示如下: