Adnroid组件 Activity数据传递/DialogActivity使用

一、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传递,在此期间还可以添加新的数据。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值