(三)基本程序单元

news/2024/4/15 13:24:21

文章目录

        • 3.1 Activity 概述
        • 3.2 创建、配置、启动和关闭 Activity
          • 3.2.1 创建Activity
          • 3.2.2 配置Activity
          • 3.3.3 启动和关闭Activity
          • 3.2.4 案例1:实现启动和关闭Activity
          • 3.2.5 案例2:实现应用对话框的关于Activity
        • 3.3 多个Activity的使用
          • 3.3.1 使用Bundle 在Activity之间交换数据
          • 3.3.2 调用另一个Activity并返回结果
          • 3.3.3 案例1:实现根据身高计算标准体重
          • 3.3.4 案例2:带选择头像的用户注册页面
        • 3.4 使用Fragment
          • 3.4.1 创建Fragment
          • 3.4.2 在Activity中添加Fragment
        • 练习3


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() {@Overridepublic 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"><applicationandroid: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"><activityandroid: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"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button1"android:text="查看详细内容"/></LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button1"android:text="关闭"/>
</LinearLayout>

DetailActivity.java

public class DetailActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.detail);//设置布局文件Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><applicationandroid: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"><activityandroid: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"><ImageViewandroid: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ImageView about = (ImageView) findViewById(R.id.about);about.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/about"/><Buttonandroid: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 {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.detail);Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><applicationandroid: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"><activityandroid: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"><TableRowandroid:id="@+id/tableRow01"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="用户名"android:id="@+id/textView1"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"/><EditTextandroid:id="@+id/user"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:minWidth="200px"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow02"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="密码"android:id="@+id/textView2"android:textSize="24px"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/pwd"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:inputType="textPassword"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow03"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="确认密码"android:id="@+id/textView3"android:textSize="24px"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/repwd"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:inputType="textPassword"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow04"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="邮箱"android:id="@+id/textView4"android:textSize="24px"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/email"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:inputType="textEmailAddress"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow05"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><Buttonandroid:text="提交"android:id="@+id/submit"android:layout_height="wrap_content"android:layout_width="wrap_content"/><Buttonandroid: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button = (Button) findViewById(R.id.submit);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/user"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/pwd"/><TextViewandroid: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 {@Overrideprotected 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;//定义一个请求码常量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button = (Button) findViewById(R.id.submit);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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();}}});}@Overrideprotected 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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/user"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/pwd"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/email"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/back"android:text="返回上一步"/></LinearLayout>

RegisterActivity.java

public class RegisterActivity extends AppCompatActivity {@Overrideprotected 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() {@Overridepublic 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"><applicationandroid: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"><activityandroid: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"><RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radioGroup1"android:orientation="horizontal"><!--radiobutton通常在radiogroup中使用--><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radio1"android:text=""/>   <!--默认选中--><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radio2"android:text="" /></RadioGroup><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="请输入您的身高cm"android:id="@+id/pHeight"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定"android:id="@+id/button1"/></LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sex"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/pheigh"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/weight"/></LinearLayout>

ResultActivity.java

public class ResultActivity extends AppCompatActivity {@Overrideprotected 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"><applicationandroid: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"><activityandroid: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"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TableLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:stretchColumns="0,3"><TableRowandroid:id="@+id/tableRow04"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/imageView1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/btn_select_icon"android:text="头像选择"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow01"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="用户名"android:id="@+id/textView1"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"/><EditTextandroid:id="@+id/editText1"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:minWidth="200px"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow02"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="密码"android:id="@+id/textView2"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"/><EditTextandroid:id="@+id/editText2"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"android:minWidth="200px"android:inputType="textPassword"/><TextView/></TableRow><TableRowandroid:id="@+id/tableRow03"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="E-mail"android:id="@+id/textView3"android:textSize="24px"android:layout_height="wrap_content"android:layout_width="wrap_content"/><EditTextandroid: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 {@Overrideprotected 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() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, HeadActivity.class);startActivityForResult(intent,0x11);}});}@Overrideprotected 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"><GridViewandroid: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};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.head);GridView gridView = (GridView) findViewById(R.id.gridView1);BaseAdapter adapter = new BaseAdapter(){@Overridepublic int getCount() {return images.length;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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() {@Overridepublic 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, BundlesavedInstancestate)//从布局文件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"><fragmentclass="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"><fragmentclass="com.jingyi.frag.listFragment"android:id="@+id/titles"android:layout_weight="1"android:layout_width="0px"android:layout_height="match_parent"/><FrameLayoutandroid: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"><applicationandroid: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"><activityandroid: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;//当前选择的索引位置@Overridepublic 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);//显示详细内容}}//保存当前选中的列表项的索引值@Overridepublic 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);//获取用于显示详细内容的Fragmentif (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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}/** 用于在手机界面显示详细内容* */public static class DetailActivity extends Activity {@Overrideprotected 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();//初始化时插入一个显示详细内容的Fragmentdetails.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@Overridepublic 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"><fragmentclass="com.jingyi.newwork.AdjustFragment"android:id="@+id/titles"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"/><FrameLayoutandroid: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;@Overrideprotected 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() {@Overridepublic 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 {@Overrideprotected 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;//当前选择的索引位置@Overridepublic 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);//显示列表项对应的内容}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("curChoice",curCheckPosition);//保存当前选中的列表项索引值}@Overridepublic 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);//获取用于显示详细内容的Fragmentif (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@Overridepublic 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() {@Overridepublic 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);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic 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() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {textView.setText(detail[getShowIndex()]+progress);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic 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() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {am.setStreamVolume(AudioManager.STREAM_MUSIC,getMaxVolume(),AudioManager.FLAG_PLAY_SOUND);textView.setText(detail[getShowIndex()]+progress);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic 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;//获取不到则返回默认值125return 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"><applicationandroid: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"><activityandroid: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>

在这里插入图片描述

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


http://www.ppmy.cn/news/158618.html

相关文章

笔记本超薄本14寸,15.6寸,16.1寸对比图

先来个反差大的 14寸对比 16寸 然后再看15.6寸对比16寸的 旗鼓相当 基本相同 看15.6 16.1背面 结论 14更适合学习&#xff0c;便于携带。

ICS TRIPLEX 处理器模块T8110B T8151B T8311 T8231 T8461

ICS TRIPLEX 处理器模块T8110B T8151B T8311 T8231 T8461ICS TRIPLEX 处理器模块T8110B T8151B T8311 T8231 T8461 Trusted处理器是受信任系统中的主要处理组件。这是一个强大的&#xff0c;用户可配置模块&#xff0c;提供总体系统控制和监控设施及流程从各种模拟和数字输入/输…

戴尔移动工作站 Precision7540拆机简介(2个 M.2 2280+1个2.5英寸)

戴尔移动工作站 Precision7540拆机简介&#xff08;2个 M.2 22801个2.5英寸&#xff09; 视频一直上传失败&#xff0c;有兴趣的点击看优酷接口说明 ①&#xff1a;使用说明书PDF文档点击这里下载查看&#xff1b; ②&#xff1a;precision7740拆机报告点击这里下载查看&…

12代酷睿笔记本有哪些不错?游匣G16体验大升级

买新不买旧&#xff0c;12代酷睿笔记本有哪些性价比高的新品呢&#xff1f;不知道有没有人喜欢游匣系列游戏本&#xff0c;尤其是刚刚上线的游匣G16新品&#xff0c;性能一绝&#xff0c;在屏幕和散热等多处设计改造&#xff0c;较上一代产品升级明显&#xff0c;体验更是畅快&…

58MM微型热敏打印机机芯中性规格书(1)

原文地址::58MM微型热敏打印机机芯中性规格书(1) - 百度文库https://wenku.baidu.com/view/ae501763773231126edb6f1aff00bed5b8f37358.html 相关文章 1、TX58打印机操作手册.doc----TX58打印机操作手册.doc 2、热敏打印计算机,58mm USB 热敏打印机(写字库源代码字库软件US…

【SSD201】 Sigmastar SSD201/202 核心板 一款超高性价比的彩屏控制方案

Sigmastar SSD201芯片介绍 SSD201是SigmaStar公司的一颗高度集成的嵌入式SOC芯片。它基于ARM Cortex-A7双核1.2GHz&#xff0c;集成了硬件H.264/H.265视频解码器、内置了DDR&#xff08;其中SSD201内嵌64MB DDR2,SSD202内嵌128MB DDR3&#xff0c;这也是201和202芯片的主要区别…

平板电脑是微型计算机吗,精雕细琢 戴尔XT2平板电脑

运用手指扒拉来操作电脑&#xff1f;相信是妙趣横生的。屏幕自由翻转&#xff1f;可以让演示与分享变得更为直观。这就是平板电脑的魅力。而戴尔新款的平板电脑 XT2&#xff0c;还具备了支持多点触控的电容式触摸屏&#xff0c;隶属于LATITUDE系列又有着充满魅力的外观设计。那…

AMD超轻薄笔记本平台进一步提升性价比

鱼和熊掌一举两得 ------AMD超轻薄笔记本平台进一步提升性价比 文/王易见 08年的上网本火得一塌糊涂&#xff0c;上网本的走红凸显了便携性对用户的重要意义&#xff0c;很明显&#xff0c;笔记本电脑朝超轻薄方向发展是必然趋势&#xff0c;不过&#xff0c;这同样给消费者带来…

每日新闻丨微软发布2毫米厚“玻璃硬盘”:可存储75.8G数据

趋势洞察 四大云提供商占据72%公共云市场 Synergy Reserve最新数据显示&#xff0c;2019年第三季度&#xff0c;在全球公共云服务市场中&#xff0c;领先的四家提供商所占比例已从2016年初的57%增长到了72%。在此期间&#xff0c;亚马逊的全球市场份额一直保持稳定在40%左右&am…

全新第八代智能英特尔® 酷睿™ 处理器经全面优化

助力笔记本、2合1产品实现卓越连接性、性能及续航时间 北京2018年8月29日电 /美通社/ -- 英特尔今天发布第八代智能英特尔 酷睿™ 处理器家族的新成员 -- U系列&#xff08;原代号为Whiskey Lake&#xff09;和Y系列&#xff08;原代号为Amber Lake&#xff09;。这两个系列首次…

厚物科技定制三屏加固便携机HW-8700TS

军用警用系列 HW-8700TS 全铝镁合金加固紧奏型体设计 特殊防撞包角及加固硅胶把手设计 高性能Intel服务器平台 Xeon至强处理器 三块17"液晶显示屏&#xff08;每块屏1280x1024分辨率&#xff09; 三屏单独显示或三屏跨屏拼接显示 内置PCIe专业独立显卡 WIFI无线扩…

x86 android 显卡 tablet2,随心而变 ThinkPad Tablet 2评测

随心而变 ThinkPad Tablet 2评测 品牌如何算是成功&#xff0c;让人们看到品牌LOGO就知道这是什么品牌。这是成功&#xff0c;但在编者看来这只是成功了一半。最成功的莫过于品牌成为行业的同义词。比如当年如日中天的诺基亚&#xff0c;比如平板行业中的苹果。 其次的就是提到…

超轻薄笔记本有了新核芯:AMD锐龙移动处理器能否改写市场格局

在2017年年初美国拉斯维加斯的CES大展上&#xff0c;采用Zen架构的AMD新款Ryzen锐龙处理器可谓赚足了眼球。之后横空出世的Ryzen 7、5、3系列产品以及拥有最高16核32线程的Ryzen Threadripper&#xff0c;也果然没有让广大玩家失望&#xff0c;无论是在DIY还是台式品牌机市场均…

4G模块G8100低功耗对比测试

4G模块G8100低功耗对比测试也许这款4G模块G8100的问世&#xff0c;是迟了一点&#xff0c;但是还是很中肯认真地测试过一遍&#xff0c;作为做手持支付一款&#xff0c;使用高通最新平台的4G模块&#xff0c;这个平台还是在高速度处理数据和图像最为稳定的一个平台&#xff0c;…

超超超超轻薄笔记本轻松get,超超超超级方便~

对于工作党而言&#xff0c;经常会遇到这样的烦恼&#xff1a;笔记本真的好重啊&#xff01;出差工作各种不便&#xff01;别急&#xff0c;我这就根据自身体验来为大家推荐几款超轻薄笔记本&#xff0c;让你再也不会为笨重的笔记本折腰&#xff01; 1.Lenovo Xiaoxin Chao 70…

喜提xtc800

昨天大出血买了辆二手的xtc800专业入门的山地车&#xff0c;好心疼啊&#xff0c;又花了不少钱&#xff0c;真想把两个爪子剁掉。 说下骑行感受&#xff0c;之前骑得是美利达公爵600可惜没多久就被偷走了&#xff0c;差点没气的把我送走。 报警也没啥用&#xff0c;警察也应付…

性能与便携可兼得:旗舰高能轻薄本雷神T-BOOK系列新品上市

在8月11日下午举行的雷神T-BOOK系列新品品鉴会上&#xff0c;雷神正式发布了雷神T-BOOK 14全新旗舰高能轻薄本&#xff0c;并提供了独显和核显两个版本。作为雷神T-BOOK系列性能新高度的迭代产品&#xff0c;这款笔记本不仅延续了T-BOOK系列至简设计风格和高性能极致体验&#…

无线化超轻薄,香港城市大学体感反馈贴片WeTac

此前&#xff0c;青亭网曾报道香港城市大学与腾讯Robotics X Lab合作研发的低电压体感方案&#xff0c;原理是通过微电流刺激来模拟触觉&#xff0c;可模拟微小物体的体感。近期&#xff0c;香港城市大学的一组科研人员也公布了一项类似的方案&#xff1a;WeTac&#xff0c;该方…

惠普Elite Mini 800 G9 评测

处理器方面&#xff0c;Elite Mini 800 G9 最高将搭载英特尔酷睿 12 代 i9-12900T 处理器&#xff0c;这款处理器拥有 8 个性能核&#xff0c;8 个能效核的设计&#xff0c;总共 16 核 24 线程&#xff0c;14MB L2 缓存&#xff0c;最高主频 4.9GHz&#xff0c;35W 基础功耗。 …

厚度仅2.5毫米,重60克,英伟达斯坦福做出了超轻薄VR眼镜

作者丨张倩 来源丨机器之心 我们什么时候能摆脱笨重的 VR 头显呢&#xff1f; 自从去年马克 扎克伯格宣布将全力开发「元宇宙」之后&#xff0c;VR、AR 等技术就在世界范围内掀起了新一轮的热潮。 这些技术为计算机图形应用等领域提供了前所未有的用户体验。然而&#xff0c;时…
最新文章