基于Android-Studio的APP开发学习笔记(三)

通知消息的显示demo

设计思路:

1.首先需要创建两个布局文件,fragment_one.xml文件用来展示返回栏、SearchView以及ListView;fragment_one_item.xml用来呈现图片和文字,在里面添加TextView、ImageView

2.布局主要采用LinearLayout,通过设置orientation属性来控制控件的摆放方式是水平还是垂直;某些情况下需要进行LinearLayout的嵌套使用

3.使用SimpleAdapter来绑定数据:使用HashMap构成List,然后将数据存储到map中,最后使用SimpleAdapter根据HashMap的键将其对应的值映射到布局文件的各个组件上

关键源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MainActivity extends AppCompatActivity {
private ListView news_list;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.fragment_one);

news_list = (ListView)findViewById(R.id.news_list);
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.fragment_one_item, new String[]{"news_title","news_info","news_thumb", "news_time"}, new int[]{R.id.news_title, R.id.news_info,R.id.news_thumb, R.id.news_time});
news_list.setAdapter(adapter);
}

private List<Map<String, Object>> getData(){
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("news_title", "10086");
map.put("news_info","您以欠费10000000元,请及时充值");
map.put("news_thumb", R.drawable.ic_launcher_background);
map.put("news_time", "6.2");
list.add(map);

map = new HashMap<String, Object>();
map.put("news_title", "10086");
map.put("news_info","您以欠费10000000元,请及时充值");
map.put("news_thumb", R.drawable.ic_launcher_background);
map.put("news_time", "6.2");
list.add(map);

map = new HashMap<String, Object>();
map.put("news_title", "10086");
map.put("news_info","您以欠费10000000元,请及时充值");
map.put("news_thumb", R.drawable.ic_launcher_background);
map.put("news_time", "6.2");
list.add(map);

map = new HashMap<String, Object>();
map.put("news_title", "10086");
map.put("news_info","您以欠费10000000元,请及时充值");
map.put("news_thumb", R.drawable.ic_launcher_background);
map.put("news_time", "6.1");
list.add(map);
return list;
}
}

ragment_one.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
android:background="#ffffff"
android:orientation="horizontal">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:tint="#2196F3"
app:srcCompat="@drawable/abc_vector_test" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"
android:layout_marginLeft="20dp"
android:textColor="#000000"
android:textSize="9pt" />
</LinearLayout>
<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:iconifiedByDefault="false"
app:defaultQueryHint="搜索通知信息">
</androidx.appcompat.widget.SearchView>

<ListView
android:id="@+id/news_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</ListView>
</LinearLayout>

ragment_one_item.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?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">

<ImageView
android:id="@+id/news_thumb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="72dp"
android:maxHeight="72dp"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/news_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="9pt"
android:textColor="#000000"/>
<TextView
android:id="@+id/news_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="7pt"
android:layout_marginLeft="230dp"
android:textColor="#000000"/>
</LinearLayout>
<TextView
android:id="@+id/news_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#8E7A7A"
android:layout_marginTop="8dp"
android:textSize="7pt" />
</LinearLayout>
</LinearLayout>

问卷调查demo

运行结果:

设计思路:

1.主要使用TextView控件、RadioButton控件和CheckBox控件;其中TextView控件用于显示title以及问卷的问题、最终的展示,RadioButton用于性别的单选,CheckBox用于兴趣爱好的复选

2.在java逻辑代码中通过获取定义的控件id来声明相关的控件变量,之后通过button.setOnClickListener()方法进行监听;对于单选,通过isChecked()来判断是否被选定;对于复选,定义了一个List来存放复选选项,之后调用List的isChecked()以及getText()方法用来判断是否被选定以及获取选择的值;最终调用setText()方法将字符串结果显示到TextView控件中

关键java源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
checkbox1 = (CheckBox) findViewById(R.id.checkbox1);
checkbox2 = (CheckBox) findViewById(R.id.checkbox2);
checkbox3 = (CheckBox) findViewById(R.id.checkbox3);
button = (Button) findViewById(R.id.button);
boy = (RadioButton) findViewById(R.id.role_boy);
girl = (RadioButton) findViewById(R.id.role_girl);
textView = (TextView) findViewById(R.id.show);

//追加到checkBoxList中
checkBoxList.add(checkbox1);
checkBoxList.add(checkbox2);
checkBoxList.add(checkbox3);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = "您的性别是:";
if(boy.isChecked()){
text += "男"; //这里图方便忘改了...
}else{
text += "女";
}
text += "\n您平时喜欢玩的游戏是:";
for (CheckBox checkbox : checkBoxList) {
if (checkbox.isChecked()) {
text += checkbox.getText().toString();
text += " ";
}
}
textView.setText(text);
}
});

菜单和按钮的事件相应demo

运行结果:

关键源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

/**
* 计算按钮
*/
private OnClickListener calc = new OnClickListener() {

public void onClick(View v) {
// 存款本金
double money = Double.parseDouble(txtMoney.getText().toString());
// 存款年限
double year = Double.parseDouble(txtYear.getText().toString());
// 本息总额
double result = 0;
// 利息率
double rate = 0;

// 根据存款年限判断利息率
if (year == 1) {
rate = 0.0175;
} else if (year == 2) {
rate = 0.0225;
} else if (year >= 3) {
rate = 0.0275;
}
// 计算利息
double interest = money * rate;
result = money + interest * year;

// 显示本息总额
txtResult.setText("本息总额是:" + String.valueOf(result) + " RMB"
+ "\n其中利息是:" + (interest * year) + " RMB");
}

};

/**
* 清除按钮
*/
private OnClickListener reset = new OnClickListener() {

public void onClick(View v) {
txtMoney.setText("");
txtYear.setText("");
txtResult.setText("");
}
};


// 切换背景
private OnClickListener bg1 = new OnClickListener() {
@Override
public void onClick(View v) {
getWindow().setBackgroundDrawableResource(R.drawable.ic_launcher_background);
}
};

private OnClickListener bg2 = new OnClickListener() {
@Override
public void onClick(View v) {
getWindow().setBackgroundDrawableResource(R.drawable.ic_launcher_foreground);
}
};

注册登录跳转与数据传送

Intent是一种消息传递机制,应用程序要启动另一个组件就需要用到Intent

根据Activity的启动方式,Intent支持显示启动和隐式启动;

显示启动可以在参数中指定组件;形式如下:

1
2
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);

上述代码的作用是从MainActivity这个Activity类跳转到SubActivity中

隐式启动没有明确的指定需要启动的组件,而是由Android系统决定(根据Intent过滤器);形式如下:

1
2
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/contacts"));
startActivity(intent);

无数据关联demo

这种是页面跳转后,在前一个页面输入的数据与后一个页面毫无关联

思路:

1.创建MainActivity.class和RegActivity.class文件,其中MainActivity.class用于呈现登录页面,并在该页面设置一个“注册”按钮,设置监听,当点击该按钮时使用Intent来启动RegActivity;RegActivity用来呈现注册页面,并在该页面设置一个“登录”按钮,设置监听,当点击该按钮时使用Intent来启动MainActivity

2.创建activity_log.xml和activity_reg.xml两个layout文件,分别用来呈现登录和注册页面

3.修改AndroidManifest.xml,两个定义的Activity都要在里面声明,并设置首先启动的Activity

AndroidManifest.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:label="@string/app_log">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".RegActivity"
android:label="@string/app_reg">
</activity>
</application>

</manifest>

MainActivity.class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends AppCompatActivity {
private Button btnReg, btnGoReg; // 分别用于注册、登录界面的注册跳转
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log);
btnGoReg = (Button)findViewById(R.id.btnGoReg);
btnGoReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(MainActivity.this, RegActivity.class);
startActivity(intent1);
}
});

}
}

数据传递跳转demo

思路:

1.创建MainActivity.class和RegActivity.class文件,其中MainActivity.class用于呈现登录页面,并在该页面设置一个“注册”按钮,设置监听,当点击该按钮时使用Intent来启动RegActivity;RegActivity用来呈现注册页面,并在该页面设置一个“登录”按钮,设置监听,当点击该按钮时使用Intent来启动MainActivity

2.在MainActivity.class中调用能获得返回值的跳转页面的方法startActivityForResult(intent,1);,其第一个参数为intent对象,第二个参数为requestCode;并重载OnActivityResult方法,根据返回的requestCode和resultCode来确定获得的Intent类型的data来自何处

3.在RegActivity.class中创建Intent对象data,调用该对象的putExtra方法将数据存到该对象中;之后用setResult(2, data);设置返回的结果,它第一个参数是resultCode,第二个参数是存储着数据的Intent对象data;之后用finish()来关闭该注册页面

MainActivity.class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends AppCompatActivity {
private Button btnGoReg; // 登录界面的注册跳转
private EditText name, pwd, email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log);

btnGoReg = (Button) findViewById(R.id.btnGoReg);
name = (EditText) findViewById(R.id.name);
pwd = (EditText) findViewById(R.id.pwd);
email = (EditText) findViewById(R.id.email);

btnGoReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(MainActivity.this, RegActivity.class);
startActivityForResult(intent1, 1);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 2) {
String content = data.getStringExtra("name");
name.setText(content);

String content1 = data.getStringExtra("pwd");
pwd.setText(content1);

String content2 = data.getStringExtra("email");
email.setText(content2);
}
}

}

RegAcitivity.class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class RegActivity extends AppCompatActivity {
private Button btnReg; // 注册界面的注册跳转
private EditText regName, regPwd, regEmail;

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

btnReg = (Button)findViewById(R.id.btnReg);
regName = (EditText)findViewById(R.id.regName);
regPwd = (EditText)findViewById(R.id.regPwd);
regEmail = (EditText)findViewById(R.id.regEmail);

btnReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent data = new Intent();
//name相当于一个key,content是返回的内容
data.putExtra("name", regName.getText().toString());
data.putExtra("pwd", regPwd.getText().toString());
data.putExtra("email", regEmail.getText().toString());
setResult(2, data);
//结束当前页面
finish();
}
});
};
}

信息保存demo

分别使用SharedPreferences进行消息的暂存、使用File相关类进行消息在设备内SD卡的存储

在写入SD卡进行存储时,需要注意读写权限的问题,不仅要在AndroidManifest.xml添加权限,还要在代码中实现动态申请

AndroidManifest.xml:

1
2
3