(三)基本程序单元



3.1 Activity 概述

Activity的中文意思是活动。在Android中,Activity 代表手机屏幕的一-屏,或是平板电脑中的一一个窗口。它是Android应用的重要组成单元之一,提供了和用户交互的可视化界面。在一个Activity中,可以添加很多组件,这些组件负责具体的功能。
在Android应用中,可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity被压入下面,成为非活动Activity,等待是否可能被恢复为活动状态。

在这里插入图片描述

在这里插入图片描述

在图3.1中,用矩形方块表示的内容为可以被回调的方法,而带底色的椭圆形则表示Activity的重要状态。从该图可以看出,在一个Activity的生命周期中有以下方法会被系统回调。

[V] onCreate()方法:在创建Activity时被回调。该方法是最常见的方法,在创建Android项目时,会自动创
建一个Activity,在该Activity中,默认重写了onCreate(Bundle savedInstanceState)方法,用于对该Activity执行
初始化.
[V] onStart()方法:启动Activity时被回调,也就是当-一个Activity变为显示时被回调。
[V] onRestart()方法:重新启动Activity时被回调,该方法总是在onStart0方法以后执行.
[V] onPause()方法:暂停Activity 时被回调。该方法需要被非常快速地执行,因为直到该方法执行完毕后,
下一个Activity才能被恢复。在该方法中,通常用于持久保存数据。例如,当我们正在玩游戏时,突然来了一个电
话,这时就可以在该方法中将游戏状态持久保存起来。
[V]onResume()方法:当Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity
栈的栈顶。该方法总是在onPause0方法以后执行。
[V] onStop()方法:停止Activity时被回调.
[V] onDestroy()方法:销毁Activity 时被回调.

回调描述
onCreate()这是第一个回调,在活动第一次创建时调用
onStart()这个回调在活动为用户可见时被调用
onResume()这个回调在应用程序与用户开始可交互的时候调用
onPause()被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
onStop()当活动不在可见时调用
onDestroy()当活动被系统销毁之前调用
onRestart()当活动被停止以后重新打开时调用
3.2 创建、配置、启动和关闭 Activity

在Android中,Activity 提供了与用户交互的可视化界面。在使用Activity时,需要先对其进行创建和配置,然后还可能需要启动或关闭Activity。

3.2.1 创建Activity

1.创建一个Activity,一般是继承android.app包中的Activity类,不过在不同的应用场景下,也可以继承Activity的子类。例如,在-一个Activity中,只想实现一个列表, 那么就可以让该Activity继承ListActivity; 如果只想实现选项卡效果,那么就可以让该Activity继承TabActivity。创建一个名为MainAcrivity的继承Activity类的Activity,具体代码如下:

import android. app. Activity;
public class MainActivity extends Activity {
}

2.重写需要的回调方法。通常情况下,都需要重写onCreate()方法,并且在该方法中调用setContentView()方法设置要显示的视图。例如,在步骤1中创建的Activity中,重写onCreate()方法,并且设置要显示的视图的具体代码如下:

@Override
public void onCreate (Bundle savedInstanceState) {
	super .onCreate ( savedInstanceState) ;
	setContentView(R. layout .main);
}
3.2.2 配置Activity

创建Activity 后,还需要在AndroidManifest.xml文件中进行配置,如果没有配置,而又在程序中启动了该Activity,那么将抛出异常信息。

具体的配置方法是在标记中添加标记。标记的基本格式
如下:

<activity
android :icon= "@drawable/图标文件名"
android :name="实现类"
android :labe1="说明性文字"
android:theme= "要应用的主题"
...>
</activity>

在标记中,android:icon 属性用于为Activity指定对应的图标,其中的图标文件名不包括扩展名; android:name 属性用子指是对应的Activity实现类; android:label 用于为该Activity 指定标签; android:theme属性用于设置要应用的主题.

说明:
如果该Activity类在标记指定的包中,则android:name属性的属性值可以直接写类名,也可以加一个“.”点号;如果在标记指定包的子包中,则属性值需要设置为“.子包序列.类名”或者是完整的类名(包括包路径)。

3.3.3 启动和关闭Activity

1.启动Activity
在一个Android项目中,如果只有一一个Activity, 那么只需要在AndroidManifet.xml文件中对其进行配置,并且将其设置为程序的入口。这样,当运行该项目时,将自动启动该Activity。否则,需要应用startActivity()方法来启动需要的Activity。startActivity()方法的语法格式如 下:

public void startActivity (Intent intent)

该方法没有返回值,只有一个Intent类型的入口参数,Intent 是Android应用里各组件之间的通信方式,一个Activity通过Intent 来表达自己的“意图”。在创建Intent对象时,需要指定想要被启动的Activity.
例如,要启动一个名称为DetailActivity的Activity,可以使用下面的代码:

Intent intent = new Intent (MainActivity . this, DetailActivity.class);
startActivity(intent);

2.关闭Activity
在Android中,如果想要关闭当前的Activity, 可以使用Activity 类提供的finish()方法。finish()方 法的语法格式
如下:

public void finish ()

该方法的使用比较简单,既没有入口参数,也没有返回值,只需要在Activity中相应的事件中调用该方法即可。例如,想要在单击按钮时关闭该Activity,可以使用下面的代码:

Button button1 = ( Button )findViewById(R. id. button1); 
button1. setOnClickListener (new View. OnClickListener() {
	@Override
	public void onClick(View v) {
		finish();//关闭当前Activity
	}
});

说明:如果当 前的Activity 不是主活动,那么执行finish(方法后,将返回到调用它的那个Activity; 否则,将
返回到主屏幕中。

3.2.4 案例1:实现启动和关闭Activity

Androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jingyi.ghost">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DetailActivity"
            android:icon="@drawable/ic_launcher_background"
            android:label="详细"
            >
        </activity>
    </application>

</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="查看详细内容"
        />


</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DetailActivity.class);//创建Intent对象
                startActivity(intent);//启动Activity
            }
        });
    }
}

detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="关闭"
        />
</LinearLayout>

DetailActivity.java

public class DetailActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail);//设置布局文件

        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }
}

在这里插入图片描述

在这里插入图片描述

3.2.5 案例2:实现应用对话框的关于Activity

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jingyi.alertactivity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AboutActivity"
            android:label="关于..."
            android:icon="@drawable/abouticon"
            android:theme="@android:style/Theme.Dialog"
            >
        </activity>
    </application>

</manifest>

说明:在标记中, 为Activity设置主题时,除了上面设置的主题样式@android:tye/The me.Dialog外,还可以设置为@android:style/Theme DeviceDefault.Light.Dialog、@android:style/Theme. Holo.Dialog、
@android:style/Theme.DeviceDefault.Dialog或者@android:style/Theme. Holo.Light.Dia- log等。使用这些主题可以让该Activity采用不同的对话框样式。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/about"
        android:src="@drawable/aboutimage"
        />

</LinearLayout>

mainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView about = (ImageView) findViewById(R.id.about);
        about.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AboutActivity.class);//创建Intent对象
                startActivity(intent);//启动Activity
            }
        });

    }
}

detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/about"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="关闭"
        android:layout_gravity="right"
        />
</LinearLayout>

aboutActivity.java

public class AboutActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }
}

在这里插入图片描述
在这里插入图片描述

3.3 多个Activity的使用

在Android应用中,经常会有多个Activity,而这些Activity之间又经常需要交换数据。下面就来介绍如何使用Bundle在Activity之间交换数据,以及如何调用另一个Activity并返回结果。

3.3.1 使用Bundle 在Activity之间交换数据

当在一个Activity中启动另一个Activity时,经常需要传递一-些数据。这时就可以通过Intent来实现,因为Intent通常被称为是两个Activity之间的信使,通过将要传递的数据保存在Intent中,就可以将其传递到另一个Activity中了。
在Android中,可以将要保存的数据存放在Bundle对象中,然后通过Intent提供的putExtras()方法将要携带的数据保存到Intent中。下面通过一个具体的实例介绍如何使用Bundle在Activity 之间交换数据。
说明: Bundle 是一个字符串值到各种Parcelable 类型的映射,用于保存要携带的数据包。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jingyi.registerghost">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".RegisterActivity"
            android:icon="@drawable/ic_launcher_background"
            android:label="显示用户注册信息"
            ></activity>
    </application>

</manifest>

main.xml

<?xml version="1.0" encoding="utf-8" ?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tablelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_vertical"
    android:stretchColumns="0,3"
    android:background="@drawable/ic_launcher_background"
    >
    <TableRow
        android:id="@+id/tableRow01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView/>
        <TextView
            android:text="用户名"
            android:id="@+id/textView1"
            android:textSize="24px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            />
        <EditText
            android:id="@+id/user"
            android:textSize="24px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:minWidth="200px"
            />
        <TextView/>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView/>
        <TextView
            android:text="密码"
            android:id="@+id/textView2"
            android:textSize="24px"
            android:layout_height="wrap_content"
            />
        <EditText
            android:id="@+id/pwd"
            android:textSize="24px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:inputType="textPassword"
            />
        <TextView/>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView/>
        <TextView
            android:text="确认密码"
            android:id="@+id/textView3"
            android:textSize="24px"
            android:layout_height="wrap_content"
            />
        <EditText
            android:id="@+id/repwd"
            android:textSize="24px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:inputType="textPassword"
            />
        <TextView/>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow04"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView/>
        <TextView
            android:text="邮箱"
            android:id="@+id/textView4"
            android:textSize="24px"
            android:layout_height="wrap_content"
            />
        <EditText
            android:id="@+id/email"
            android:textSize="24px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:inputType="textEmailAddress"
            />
        <TextView/>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow05"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView/>
        <Button
            android:text="提交"
            android:id="@+id/submit"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            />
        <Button
            android:text="退出"
            android:id="@+id/exit"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            />
        <TextView/>
    </TableRow>

</TableLayout>

MainActivity.java

package com.jingyi.registerghost;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String user = ((EditText) findViewById(R.id.user)).getText().toString();//获取用户名
                String password = ((EditText) findViewById(R.id.pwd)).getText().toString();//获取输入的密码
                String rePassword = ((EditText) findViewById(R.id.repwd)).getText().toString();//获取再次输入的密码
                String email = ((EditText) findViewById(R.id.email)).getText().toString();//获取输入的email地址

                if (!"".equals(user)&&!"".equals(password)&&!"".equals(email)){
                    if (!password.equals(rePassword)){//判断两次密码是否输入一致
                        Toast.makeText(MainActivity.this, "两次输入的密码不一致,请重新输入!", Toast.LENGTH_SHORT).show();
                        ((EditText) findViewById(R.id.pwd)).setText("");//清空”密码“的编辑框
                        ((EditText) findViewById(R.id.repwd)).setText("");//清空”确认密码“的编辑框
                        ((EditText) findViewById(R.id.pwd)).requestFocus();//密码编辑框获取焦点
                    }else{
                        Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
                        Bundle bundle = new Bundle();//初始化并实例化一个Bundle对象
                        bundle.putCharSequence("user",user);
                        bundle.putCharSequence("password",password);
                        bundle.putCharSequence("email",email);
                        intent.putExtras(bundle);//将Bundle对象添加到Intent对象中
                        startActivity(intent);

                    }
                }else{
                    Toast.makeText(MainActivity.this, "请将所有的注册信息填写完整!", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Register.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/user"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pwd"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/email"
        />

</LinearLayout>

RegisterActivity.java

package com.jingyi.registerghost;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class RegisterActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);

        Intent intent = getIntent();//获取Intent对象
        Bundle bundle = intent.getExtras();//获取传递的数据包
        TextView user = (TextView) findViewById(R.id.user);
        user.setText("用户名:"+bundle.getString("user"));
        TextView password = (TextView) findViewById(R.id.pwd);
        password.setText("密码:"+bundle.getString("password"));
        TextView email = (TextView) findViewById(R.id.email);
        email.setText("E-mail:"+bundle.getString("email"));

    }
}

在这里插入图片描述

在这里插入图片描述

3.3.2 调用另一个Activity并返回结果

在Android应用开发时,有时需要在一个Activity中调用另一个Activity,当用户在第二个Activity中选择完成
后,程序自动返回到第一个 Activity中,第一 个Activity 必须能够获取并显示用户在第二个Activity中选择的结果;
或者,在第一个Activity中将一些 数据传递到第二个Activity,由于某些原因,又要返回到第一个 Activity中,并显
示传递的数据,如程序中经常出现的“返回上一步"功能。这时,也可以通过Intent 和Bundle来实现。与在两个Acitivity
之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个 Activity。下面通过一个 具体的实
例介绍如何调用另一个Activity并返回结果。

在上个案例基础上修改

MainActivity.java

public class MainActivity extends AppCompatActivity {
    final int CODE=0x717;//定义一个请求码常量
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String user = ((EditText) findViewById(R.id.user)).getText().toString();//获取用户名
                String password = ((EditText) findViewById(R.id.pwd)).getText().toString();//获取输入的密码
                String rePassword = ((EditText) findViewById(R.id.repwd)).getText().toString();//获取再次输入的密码
                String email = ((EditText) findViewById(R.id.email)).getText().toString();//获取输入的email地址

                if (!"".equals(user)&&!"".equals(password)&&!"".equals(email)){
                    if (!password.equals(rePassword)){//判断两次密码是否输入一致
                        Toast.makeText(MainActivity.this, "两次输入的密码不一致,请重新输入!", Toast.LENGTH_SHORT).show();
                        ((EditText) findViewById(R.id.pwd)).setText("");//清空”密码“的编辑框
                        ((EditText) findViewById(R.id.repwd)).setText("");//清空”确认密码“的编辑框
                        ((EditText) findViewById(R.id.pwd)).requestFocus();//密码编辑框获取焦点
                    }else{
                        Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
                        Bundle bundle = new Bundle();//初始化并实例化一个Bundle对象
                        bundle.putCharSequence("user",user);
                        bundle.putCharSequence("password",password);
                        bundle.putCharSequence("email",email);
                        intent.putExtras(bundle);//将Bundle对象添加到Intent对象中
                       startActivityForResult(intent,CODE);

                    }
                }else{
                    Toast.makeText(MainActivity.this, "请将所有的注册信息填写完整!", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==CODE&&resultCode==CODE){
            ((EditText) findViewById(R.id.pwd)).setText("");//清空”密码“的编辑框
            ((EditText) findViewById(R.id.repwd)).setText("");//清空”确认密码“的编辑框
        }
        
    }
}

register.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/user"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pwd"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/email"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/back"
        android:text="返回上一步"
        />

</LinearLayout>

RegisterActivity.java

public class RegisterActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);

        Intent intent = getIntent();//获取Intent对象
        Bundle bundle = intent.getExtras();//获取传递的数据包
        TextView user = (TextView) findViewById(R.id.user);
        user.setText("用户名:"+bundle.getString("user"));
        TextView password = (TextView) findViewById(R.id.pwd);
        password.setText("密码:"+bundle.getString("password"));
        TextView email = (TextView) findViewById(R.id.email);
        email.setText("E-mail:"+bundle.getString("email"));

        Button button = (Button) findViewById(R.id.back);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(0x717,intent);//设置返回的结果码
                finish();
            }
        });

    }
}

其余不做改动

在这里插入图片描述

3.3.3 案例1:实现根据身高计算标准体重

Bean.java

package com.jingyi.bmi;

import java.io.Serializable;

public class Bean  implements Serializable {
    private static final long SerialVersionUID= 1L;
    private String sex="";
    private int P_height=0;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getP_height() {
        return P_height;
    }

    public void setP_height(int p_height) {
        P_height = p_height;
    }
}

说明:在使用Bundle类传递数据包时,可以放入-一个可序列化的对象。这样,当要传递的数据字段比较多时,
采用该方法比较方便。在本实例中,为了在Bundle中放入-一个可序列化的对象,我们创建了一个可序列化的Java .
类,方便存储可序列化对象。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jingyi.bmi">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ResultActivity"
            android:icon="@drawable/ic_launcher_background"
            android:label="计算结果"
            ></activity>
    </application>

</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >


    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/radioGroup1"
        android:orientation="horizontal"
        >
        <!--radiobutton通常在radiogroup中使用-->
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radio1"
            android:text=""
            />   <!--默认选中-->
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radio2"
            android:text="" />
    </RadioGroup>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="请输入您的身高cm"
        android:id="@+id/pHeight"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确定"
        android:id="@+id/button1"
        />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bean bean = new Bean();
                if ("".equals(((EditText)findViewById(R.id.pHeight)).getText().toString())){
                    Toast.makeText(MainActivity.this, "请输入您的身高!", Toast.LENGTH_SHORT).show();
                    return;
                }
                int p_height=Integer.parseInt((((EditText)findViewById(R.id.pHeight)).getText().toString()));
                RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);

                //获取单选按钮组的值
                for (int i=0;i<radioGroup.getChildCount();i++){
                    RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);//根据索引值获取单选按钮
                    if (radioButton.isChecked()){
                        bean.setSex(radioButton.getText().toString());//设置性别
                        break;
                    }
                }
                bean.setP_height(p_height);//设置身高
                Bundle bundle = new Bundle();
                bundle.putSerializable("bean",bean);
                Intent intent = new Intent(MainActivity.this, ResultActivity.class);
                intent.putExtras(bundle);//将Bundle对象添加到Intent对象中
                startActivity(intent);
            }
        });
    }
}

result.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/sex"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pheigh"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/weight"
        />

</LinearLayout>

ResultActivity.java

public class ResultActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);

        TextView sex = (TextView) findViewById(R.id.sex);
        TextView height = (TextView) findViewById(R.id.pheigh);
        TextView weight = (TextView) findViewById(R.id.weight);

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        Bean bean = (Bean)bundle.getSerializable("bean");
        sex.setText("您是一位"+bean.getSex()+"士");
        height.setText("您的身高为:"+bean.getP_height()+"cm");
        weight.setText("您的标准体重应为"+getBMI(bean.getSex(),bean.getP_height())+"kg");

    }

    private  String getBMI(String sex,float pheight){
        String weight="";
        DecimalFormat format = new DecimalFormat();
        if (sex.equals("男")){
            weight=format.format((pheight-80)*0.7);
        }else{
            weight=format.format((pheight-70)*0.6);
        }
        return weight;
    }
}

在这里插入图片描述

在这里插入图片描述

3.3.4 案例2:带选择头像的用户注册页面

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jingyi.sculpture">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".HeadActivity"
            android:icon="@drawable/ic_launcher_background"
            android:label="头像选择"
            ></activity>
    </application>

</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TableLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:stretchColumns="0,3">
            <TableRow
                android:id="@+id/tableRow04"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
                <TextView/>
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/imageView1"/>
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/btn_select_icon"
                    android:text="头像选择"
                    />
                <TextView/>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow01"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
                <TextView/>
                <TextView
                    android:text="用户名"
                    android:id="@+id/textView1"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    />
                <EditText
                    android:id="@+id/editText1"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:minWidth="200px"
                    />
                <TextView/>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow02"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
                <TextView/>
                <TextView
                    android:text="密码"
                    android:id="@+id/textView2"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    />
                <EditText
                    android:id="@+id/editText2"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:minWidth="200px"
                    android:inputType="textPassword"
                    />
                <TextView/>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow03"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                >
                <TextView/>
                <TextView
                    android:text="E-mail"
                    android:id="@+id/textView3"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    />
                <EditText
                    android:id="@+id/editText3"
                    android:textSize="24px"
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:minWidth="200px"
                    android:inputType="textEmailAddress"
                    />
                <TextView/>
            </TableRow>
        </TableLayout>

    </LinearLayout>
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.btn_select_icon);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, HeadActivity.class);
                startActivityForResult(intent,0x11);
            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode==0x11&& resultCode==0x12){//判断是否为待处理的结果
            Bundle bundle = data.getExtras();//获取传递的数据包
            int image = bundle.getInt("image");//获取选择的头像索引
            ImageView imageView = (ImageView) findViewById(R.id.imageView1);
            imageView.setImageResource(image);
        }
    }
}

head.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <GridView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/gridView1"
        android:layout_marginTop="10px"
        android:horizontalSpacing="3px"
        android:verticalSpacing="3px"
        android:numColumns="4"
        />


</LinearLayout>

HeadActivity.java

public class HeadActivity extends AppCompatActivity {

    public int[] images=new int[]{R.mipmap.img1,R.mipmap.img2,R.mipmap.img3,R.mipmap.img4,R.mipmap.img5,R.mipmap.img6,R.mipmap.img7,R.mipmap.img8};

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.head);
        GridView gridView = (GridView) findViewById(R.id.gridView1);
        BaseAdapter adapter = new BaseAdapter(){

            @Override
            public int getCount() {
                return images.length;
            }

            @Override
            public Object getItem(int position) {
                return position;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView imageView;
                if (convertView==null){
                     imageView = new ImageView(HeadActivity.this);//实例化ImageView对象
                    /*设置图像放入宽度和高度*/
                    imageView.setAdjustViewBounds(true);
                    imageView.setMaxWidth(158);
                    imageView.setMaxHeight(150);
                    imageView.setPadding(5,5,5,5);
                }else{
                    imageView=(ImageView) convertView;
                }
                imageView.setImageResource(images[position]);
                return imageView;
            }
        };
        gridView.setAdapter(adapter);

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = getIntent();//获取intent对象
                Bundle bundle = new Bundle();//实例化传递的数据包
                bundle.putInt("image",images[position]);//显示选中的图片
                intent.putExtras(bundle);//将数据包保存到intent中
                setResult(0x12,intent);
                finish();//选择完成后关闭当前Activity
            }
        });
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4 使用Fragment

Fragment是Android 3.0新增的概念,其中文意思是碎片,它与Activity十分相似,用来在一个Activity中描述一些行为或一 部分 用户界面。使用多个Fragment可以在一个 单独的Activity 中建立多个UI面板,也可以在多个Activity中重用Fragment。
一个Fragment必须被嵌入到一个Activity中,它的生命周期直接受其所属的宿主Activity的生命周期影响。例如,当Activity被暂停时,其中的所有Fragment也被暂停;当Activity被销毁时,所有隶属于它的Fragment也将被销毁。然而,当一个Activity处于resumed状态(正在运行)时,可以单独地对每一个Fragment进行操作,如添加或删除等。

3.4.1 创建Fragment

要创建一个Fragment,必须创建一个 Fragment的子类,或者继承自另一个已经存在的Fragment 的子类。例如,要创建一个名称为NewsFragment的Fragment,并重写onCreateView()方法,可以使用下面的代码:

public class NewsFragment extends Fragment {
@override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle
	savedInstancestate)
	//从布局文件news.xml加载一个布局文件
	View v = inflater. inflate(R. layout.news, container, true);
	return V;
}

说明:当系统首次调用Fragment时,如果想绘制一个 UI界面,那么在Fragment中,必须重写onCreateView(方法返回一个View;否则,如果Fragment没有UI界面,可以返回null。

3.4.2 在Activity中添加Fragment

1.直接在布局文件中添加Fragment

,android:name属性用于指定要添加的Fragment

2.当Activity运行时添加Fragment

当Activity运行时,也可以将Fragment添加到Activity 的布局中,实现方法是获取一个FragmenfTransaction 的实例,然后使用add()方法添加一个Fragment, add()方法的第一个参数是Fragment要放入的ViewGroup (由Resource ID指定),第二个参数是需要添加的Fragment,最后为了使改变生效,还必须调用commit()方法提交事务。

DetailFragment details = new DetailFragment();//实例化 DetailFragment的对象
FragmentTransaction ft = getFragmentManager().beginTransaction();//获得一个FragmentTransaction的实例
ft.add(android.R.id.content, details).commit();//添加一个显示详细内容的Fragment
ft.commit();//提交事务

在这里插入图片描述

layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

   <fragment
       class="com.jingyi.frag.listFragment"
       android:id="@+id/titles"
       android:layout_weight="1"
       android:layout_width="0px"
       android:layout_height="match_parent"
       />


</LinearLayout>

layout-land/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        class="com.jingyi.frag.listFragment"
        android:id="@+id/titles"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent"
        />
    <FrameLayout
        android:id="@+id/detail"
        android:layout_weight="2"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground"
        />
</LinearLayout>

detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.jingyi.frag">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Application">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity$DetailActivity"
            android:label="详细内容"
            ></activity>
    </application>

</manifest>

Data.java

package com.jingyi.frag;

public final class Data {
    //标题
    public static final String[] TITLES={
            "索尼相机Sony",
            "富士相机Fujifilm",
            "佳能相机Canon",
            "尼康相机Nikon"

    };
    //详细内容
    public static final String[] DETAIL={
            "索尼照相机也是索尼公司的优质产品之一,索尼照相机走的是高端时尚前卫路线,CCD技术先进, 便携中的高像素,防抖,自动捕捉头像,而且索尼照相机还支持笑脸快门,可以捕捉精彩的一瞬间。",
            "富士相机发展历史富士胶片株式会社(以下简称:富士胶片)自1934年创建以来,不断以坚 定的步伐向前迈进, 发展已成为世界上规模最大的综合性影像、信息、文件处理类产品及服务的制造和供应商之一。现任全球总裁兼CEO古森重隆, 总部位于日本东京。富士胶片从20世纪60年代后期开始积极向海外发展, 构筑了强大的全球生产、销售和服务网络。 富士集团包括富士胶片株式会社、282家子公司和40家从事研发、制造、软件开发、市场和采购及相关经营活动的关联公司, 分布于世界200多个国家和地区, 海外销售额已接近合并报表净销售总额的50%。富士胶片有三大事业领域, 即1. 包含传统和数码两大产品群(胶片、照相机 [1]  、相纸、化学药品、冲扩设备等)的影像事业领域;2. 包含印刷系统、医疗系统、液晶材料、记录媒体等系列产品的信息事业领域; 3. 由富士胶片的子公司富士施乐公司生产和销售的文件处理设备(复印机、打印机、多功能数码文印中心、耗材等)构成的文件事业领域。",
            "佳能Canon,在20世纪初期,日本相机行业十分落后,当时的人们多数都使用外国货。为此,几个日本年轻人为了制造国产的相机,开始仿造高档德国相机。佳能于1934年,在东京的一个小工场里成功仿制了德国徕卡Leica相机,也研制出了日本第一架35mm焦平面快门照相机KWANON。",
            "尼康(Nikon),是日本的一家著名相机制造商,成立于1917年,当时名为日本光学工业株式会社。1988年该公司依托其照相机品牌,更名为尼康株式会社。“尼康(Nikon)”的名称,从1946年开始使用,是“日本光学”日文读音(Nippon Kogaku)的罗马字母缩写,并且融合了德文中蔡司照相机ZeissIkon中kon的写法。尼康其众多的相机产品中,最主要的有尼克尔(Nikkor)相机镜头、尼康水下照相机(Nikonos)、尼康F系列的135胶卷单反相机、还有尼康D系列的数码单反相机,消费性数码相机Coolpix系列,以及尼康Z系列数码微单相机。尼康也是分步重复半导体生产设备(分档器)的制造商。公司还生产护目镜,眼科检查设备,双筒望远镜,显微镜,勘测器材。2017年10月30日,尼康中国正式对外宣布,该公司将停止位于无锡市的子公司尼康光学仪器(中国)有限公司的经营活动。与此同时,负责生产尼康数码相机以及数码相机配件的工厂也将停产。"
    };
}

listFragment.java

public class listFragment extends android.app.ListFragment {
    boolean dualPane;//是否在同一屏幕上同时显示列表和详细内容
    int curCheckPosition=0;//当前选择的索引位置

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_checked,Data.TITLES));//为列表设置适配器
        View detailFrame = getActivity().findViewById(R.id.detail);//获取布局文件中帧布局管理器
        dualPane=detailFrame !=null && detailFrame.getVisibility()==View.VISIBLE;//判断是否在同一屏幕上同时显示列表和内容
        if (savedInstanceState!=null){
            curCheckPosition=savedInstanceState.getInt("curChoice",0);//更新当前选择的索引位置
        }
        if (dualPane){//如果在在同一个屏上同时显示列表和详细内容
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//设置列表为单选模式
            showDetail(curCheckPosition);//显示详细内容
        }

    }

    //保存当前选中的列表项的索引值
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice",curCheckPosition);
    }
    public void onListItemClick(ListView l,View v,int positon,long id){
        showDetail(positon);//显示详细内容
    }

     void showDetail(int index) {
        curCheckPosition=index;//更新当前选中值
         if (dualPane){//同时显示
             getListView().setItemChecked(index,true);//设置选中列表项为选中状态
             DetailFragment details = (DetailFragment) getFragmentManager().findFragmentById(R.id.detail);//获取用于显示详细内容的Fragment
             if (details==null||details.getShowIndex()!=index){
                 details=DetailFragment.newInstance(index);//创建一个新的DetailFragment实例
                 FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                 fragmentTransaction.replace(R.id.detail,details);//替换 原来显示的内容
                 fragmentTransaction.setTransition(fragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置转换效果
                 fragmentTransaction.commit();//提交事务
             }
         }else{//只显示一种内容
             Intent intent = new Intent(getActivity(), MainActivity.DetailActivity.class);
             intent.putExtra("index",index);
             startActivity(intent);

         }

    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    /*
    * 用于在手机界面显示详细内容
    * */
    public static class DetailActivity extends Activity {

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.detail);
            //判断是否为横屏,横屏则结束当前Activity,使用Fragment显示详细内容
            if (getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE){
                fileList();
                return;
            }
            if (savedInstanceState==null){
                DetailFragment details = new DetailFragment();//初始化时插入一个显示详细内容的Fragment
                details.setArguments(getIntent().getExtras());//实例化DetailFragment对象
                getFragmentManager().beginTransaction().add(android.R.id.content,details).commit();//添加一个显示详细内容的Fragment
            }
        }
    }
}

DetailFragment.java

public class DetailFragment extends Fragment {
    /*
    * 创建一个DetailFragment的新实例,包括要传递的数据包
    * */
    public static DetailFragment newInstance(int index){
        DetailFragment detailFragment = new DetailFragment();
        Bundle bundle = new Bundle();//实例化一个Bundle对象
        bundle.putInt("index",index);//将索引值添加到Bundle对象中
        detailFragment.setArguments(bundle);//将bundle对象作为Fragment的参数保存
        return  detailFragment;
    }
    public int getShowIndex(){
        return getArguments().getInt("index",0);//获取要显示的列表项索引
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        if (container==null){
            return null;
        }
        ScrollView scrollView = new ScrollView(getActivity());//创建一个滚动视图
        TextView text = new TextView(getActivity());//创建一个文本框对象
        text.setPadding(10,10,10,10);
        scrollView.addView(text);//将文本框对象添加到滚动视图中
        text.setText(Data.DETAIL[getShowIndex()]);//设置文本框中要显示的文本
        return  scrollView;
    }
}


在这里插入图片描述

在这里插入图片描述

练习3

登录后主界面列表选择第二个选项后,跳转到另一个Activity,并且传过去一个字符串,在新的Activity中包含2个Fragment,左边的Fragment类似手机设置,含一个亮度设置选项,点击后右边的Fragment显示具体的亮度设置界面。

adjustsettings.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        class="com.jingyi.newwork.AdjustFragment"
        android:id="@+id/titles"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />
    <FrameLayout
        android:id="@+id/detail"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:background="?android:attr/detailsElementBackground"
        />
</LinearLayout>

MainActivity.java

package com.jingyi.newwork;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName MainActivity
 * @Description TODO
 * @Author Yu
 * @Date 2022/5/13 16:11
 * @Version 1.0
 **/
public class MainActivity extends Activity {
    public ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = findViewById(R.id.listView);

        String[] name = {"图库", "音量与亮度", "于泳", "于泳", "于泳"};
        int[] nums = {1, 2, 3, 4, 5};
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < name.length; i++) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", name[i]);
            map.put("index", nums[i]);
            list.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item, new String[]{"name", "index"}, new int[]{R.id.name_item, R.id.index_item});
        mListView.setAdapter(adapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position==0){
                    Intent intent = new Intent(MainActivity.this, imagesActivity.class);
                    startActivity(intent);
                }if(position==1){
                    Intent intent = new Intent(MainActivity.this, AdjustActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("sentence","请在这里进行详细调节");
                    intent.putExtras(bundle);
                    startActivity(intent);
                }
                Toast.makeText(MainActivity.this, "您选中的是第"+(position+1)+"项", Toast.LENGTH_SHORT).show();
            }
        });


    }
}

AdjustActivity.java

package com.jingyi.newwork;



import android.app.Activity;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

/**
 * @ClassName AdjustActivity
 * @Description TODO
 * @Author Yu
 * @Date 2022/6/6 16:46
 * @Version 1.0
 **/
public class AdjustActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(AdjustActivity.this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
                        Uri.parse("package:" + getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivityForResult(intent, 200);
            } else {
                // 如果有权限做些什么
                setContentView(R.layout.adjustsettings);
                String sentence = getIntent().getExtras().getString("sentence").toString();
                Toast.makeText(AdjustActivity.this, sentence, Toast.LENGTH_SHORT).show();
            }
        }
    }
}

AdjustFragment.java

package com.jingyi.newwork;

import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import android.app.ListFragment;

/**
 * @ClassName AdjustFragment
 * @Description TODO
 * @Author Yu
 * @Date 2022/6/6 16:47
 * @Version 1.0
 **/
public class AdjustFragment extends ListFragment {
    int curCheckPosition=0;//当前选择的索引位置

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String [] titles={"亮度调节","音量调节"};
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,titles));//列表适配器设置内容
        if (savedInstanceState!=null){
            curCheckPosition=savedInstanceState.getInt("curChoice",0);//当前选择项的索引位置
        }
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//列表选择模式为单选模式
        showDetail(curCheckPosition);//显示列表项对应的内容
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice",curCheckPosition);//保存当前选中的列表项索引值
    }

    @Override
    public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        showDetail(position);//展示对应内容
    }

    void showDetail(int index) {
        getListView().setItemChecked(index, true);//设置选中列表项为选中状态
        DetailFragment details = (DetailFragment) getFragmentManager().findFragmentById(R.id.detail);//获取用于显示详细内容的Fragment
        if (details == null || details.getShowIndex() != index) {
            details = DetailFragment.newInstance(index);//创建一个新的DetailFragment实例
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.detail, details);//替换 原来显示的内容
            fragmentTransaction.setTransition(fragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置转换效果
            fragmentTransaction.commit();//提交事务
        }
    }
}

DetailFragment.java

package com.jingyi.newwork;



import static androidx.core.content.ContextCompat.getSystemService;

import android.app.Service;
import android.content.ContentResolver;

import android.media.AudioManager;
import android.os.Bundle;
import android.provider.Settings;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.app.Fragment;

/**
 * @ClassName DetailFragment
 * @Description TODO
 * @Author Yu
 * @Date 2022/6/6 17:00
 * @Version 1.0
 **/
public class DetailFragment extends Fragment {
    String [] detail={"当前亮度:","当前音量:"};
    //AudioManager am = (AudioManager)getActivity().getSystemService(Service.AUDIO_SERVICE);



    public static DetailFragment newInstance(int index) {
        Bundle bundle = new Bundle();
        DetailFragment fragment = new DetailFragment();
        bundle.putInt("index",index);
        fragment.setArguments(bundle);
        return fragment;
    }
    public int getShowIndex(){
        return getArguments().getInt("index",0);///获取要显示的列表项索引
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (container==null){
            return  null;
        }
        LinearLayout layout = new LinearLayout(getActivity());//创建线性布局视图
        layout.setOrientation(LinearLayout.VERTICAL);
        if (getShowIndex()==0){//亮度调节返回的页面
            TextView textView = new TextView(getActivity());//创建文本框对象
            SeekBar seekBar = new SeekBar(getActivity());//创建拖动条对象


            textView.setText(detail[getShowIndex()]+getScreenBrightness());//显示当前亮度
            seekBar.setMax(255);
            seekBar.setProgress(getScreenBrightness());//获取当前屏幕亮度并设置进度条显示
            seekBar.setPadding(10,10,10,10);

            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    setScrennManualMode();
                    ContentResolver contentResolver = getActivity().getContentResolver();
                    Settings.System.putInt(contentResolver,
                            Settings.System.SCREEN_BRIGHTNESS, progress);
                    textView.setText(detail[getShowIndex()]+progress);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            textView.setPadding(10,500,10,10);
            textView.setGravity(Gravity.CENTER_HORIZONTAL);
            layout.addView(textView);
            layout.addView(seekBar);
            return  layout;
        }
        if (getShowIndex()==1){//音量调节页面
            TextView textView = new TextView(getActivity());//创建文本框对象
            SeekBar seekBar = new SeekBar(getActivity());//创建拖动条对象

            textView.setText(detail[getShowIndex()]+"30");//显示当前音量
            seekBar.setMax(100);
            seekBar.setProgress(30);//获取当前系统媒体音量显示
            seekBar.setPadding(10,10,10,10);

            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    textView.setText(detail[getShowIndex()]+progress);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            textView.setPadding(10,500,10,10);
            textView.setGravity(Gravity.CENTER_HORIZONTAL);
            layout.addView(textView);
            layout.addView(seekBar);
            return  layout;
        }
        /*if (getShowIndex()==1){//音量调节页面
            TextView textView = new TextView(getActivity());//创建文本框对象
            SeekBar seekBar = new SeekBar(getActivity());//创建拖动条对象

            textView.setText(detail[getShowIndex()]+getCurrentVolume());//显示当前音量
            seekBar.setMax(getMaxVolume());
            seekBar.setProgress(getCurrentVolume());//获取当前系统媒体音量显示
            seekBar.setPadding(10,10,10,10);

            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    am.setStreamVolume(AudioManager.STREAM_MUSIC,getMaxVolume(),AudioManager.FLAG_PLAY_SOUND);
                    textView.setText(detail[getShowIndex()]+progress);
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            layout.addView(textView);
            layout.addView(seekBar);
            return  layout;
        }*/
        return layout;
    }
    /**
     * TODO
     * @Author Yu
     * @Date
     * @brief 更改系统屏幕亮度调节模式
     * @param
     * @return
     */

    private void setScrennManualMode(){
        ContentResolver contentResolver = getActivity().getContentResolver();
        try {
            int mode = Settings.System.getInt(contentResolver,
                    Settings.System.SCREEN_BRIGHTNESS_MODE);
            if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
                Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
                        Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
            }
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * TODO
     * @Author Yu
     * @Date
     * @brief 获取当前系统屏幕亮度
     * @param
     * @return
     */

    private int getScreenBrightness() {
        ContentResolver contentResolver = getActivity().getContentResolver();
        int defVal = 125;//获取不到则返回默认值125
        return Settings.System.getInt(contentResolver,
                Settings.System.SCREEN_BRIGHTNESS, defVal);
    }
    /**
     * TODO
     * @Author Yu
     * @Date
     * @brief 获取当前系统音量
     * @param
     * @return
     */
   /* private int getCurrentVolume(){
        return am.getStreamVolume(AudioManager.STREAM_MUSIC);
    }*/
    /**
     * TODO
     * @Author Yu
     * @Date
     * @brief 获取系统最大的音量
     * @param
     * @return
     */
   /* private  int getMaxVolume(){
        return am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    }*/

}

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.jingyi.newwork">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TSNewApplication">
        <activity
            android:name=".MainActivity"
            >
        </activity>
        <activity android:name=".LoginActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".imagesActivity"
            >
        </activity>
        <activity android:name=".AdjustActivity"
            android:label="系统调节"
            >
        </activity>
    </application>
</manifest>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值