一、DialogActivity概述
在使用Dialog时,如果需要用到很多自己设计的控件,虽然可以让弹出框显示出我们需要的界面,但却无法找到地方完成控制代码的编写,如何解决这个问题呢,我们可以将Activity伪装成Dialog弹出框,这样既显示了界面,又可以在Activity里写控制代码。这就是DialogActivity。
默认情况下,一个Activity占据整个屏幕。然而,可以为一个Activity设置一个“对话框”主题,这样它就能像一个浮动的对话框显示出来了。举个例子,你可能想要把你的Activity定义成一个弹出的“对话框”,通知用户进行一些操作。 在这种情况下,显示一个“对话框”样式的Activity是一个引起用户注意的好方法。
其实DialogActivity问题的关键在下面这句:
- Theme.AppCompat.DayNight.Dialog 设置Activity样式为Dialog样式
- windowNoTitle 关闭Activity的标题
<style name="DialogTheme" parent="Theme.AppCompat.DayNight.Dialog">
<!-- Customize your theme here. -->
<item name="windowNoTitle">true</item>
</style>
二、实现步骤
1.创建一个EmptyActivity并继承AppCompatActivity
2.自定义Activity布局里的内容
3.在AndroidMenifest.xml设置Activity的显示风格
Dialog.xml 代码实现:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
tools:context=".DialogActivity"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_gravity="center_horizontal"
android:text="请输入账号密码"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/dEmail"
android:hint="email address"
android:ems="16"
android:lines="1"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"/>
<EditText
android:id="@+id/dPassword"
android:hint="password"
android:inputType="textPassword"
android:ems="16"
android:lines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"/>
<LinearLayout
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/back"
android:text="取消"
android:layout_width="120dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/enter"
android:text="确认"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"/>
</LinearLayout>
</LinearLayout>
样式展示:
style.xml中设置好风格:
<resources>
<style name="DialogTheme" parent="Theme.AppCompat.DayNight.Dialog">
<item name="windowNoTitle">true</item>
</style>
</resources>
在AndroidManifest.xml中引用:
<activity android:name=".DialogActivity"
android:theme="@style/DialogTheme">
</activity>
这样一个DialogActivity的界面就做好了。在代码中使用Intent来启动就可以了。
startActivity(new Intent(当前的环境上下文 this, 需要跳转的Activity DialogActivitiy.class));
可以配合Activity的数据传递完成一些操作。
三、Activity 之间的数据传递
在自定义的Activity中可以看到账号密码的数据在两个Activity之间传递。现在我们就学习是如何做到的。
1.传递数据给另一个 Activity
MainActivity传递数据:
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
//以Map的形式传递
intent.putExtra("string", "hello");
intent.putExtra("int", 123);
//传递Bundle对象
String[] data = new String[2];
data[0] = "123";
data[1] = "abc";
Bundle bundle = new Bundle();
bundle.putStringArray("data", data);
intent.putExtras("bundle", bundle);
//传递自定义对象
//需要对象实现序列化 class Student implements Serializable
Student stu = new Student("David");
intent.putExtras("stu", stu);
startActivity(intent);
需要对象实现序列化 class Student implements Serializable
,这里需要注意若 Student
还有内部类,那么内部类也需要实现序列化 Implements Serializable
.
DialogActivity中取出数据:
Intent intent = getIntent();
//以Map的形式获取
String str = intent.getStringExtra("string");
int i = intent.getIntExtra("int");
Bundle bundle = intent.getBundleExtra("bundle");
String[] str = bundle.getStringArray("data");
Student stu = (Student) intent.getSerializableExtra("stu");
String name = stu.getName();
2.返回数据给上一个Activity
MainActivity中启动另一个 Activity:
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
//参数2:请求码
startActivityForResult(intent, 1000);
DialogActivity中返回数据:
String[] data = new String[2];
data[0] = "123";
data[1] = "abc";
Intent intent = new Intent(DialogActivity.this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putStringArray("data", data);
intent.putExtras(bundle);
//设置结果
//参数1:结果码,在上一个界面的onActivityResult方法中通过resultCode获取
//参数2:意图对象,主要作用:放数据,在上一个界面的onActivityResult方法中通过data获取
DialogActivity.this.setResult(RESULT_OK, intent);
//点击关闭Activity
DialogActivity.this.finish();
MainActivity中通过重写onActivityResult回调方法来获取返回的数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//resultCode: 0 == RESULT_CANCEL 取消,-1 == RESULT_OK 正确处理完后返回
if (resultCode == RESULT_OK) {
//requestCode:用来区分该结果是来自于哪个Activity
if (requestCode == 1000) {
Bundle bundle = data.getExtras();
if (bundle != null) {
String[] data = bundle.getStringArray("data");
}
}
}
}
基本的Activity之间的传递数据就是这样了。
个人感觉使用 Intent 传递数据有些像用 Bundle 传递数据。
区别就是:现在有A、B、C三个Activity,我要把值通过A经过B传给C。如果用Intent则需要一个个取出来再塞回去。用Bundle可以把数据打包,然后通过Intent传递,在此期间还可以添加新的数据。