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>