按钮

按钮的监听事件:

  1. ​ 可以使用匿名类的方式实现。
  2. 可以直接实现OnClickListener接口,之后实现onClick方法实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends BaseActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button_1);
button.setOnClickListener(this);
}

@Override
public void onClick(View v) {
Log.d("BaseActivity","test");
if (v.getId() == R.id.button_1) {
Log.d("BaseActivity","接口BUTTON实现");
Toast.makeText(MainActivity.this, "接口BUTTON实现", Toast.LENGTH_SHORT).show();
}
}
}

注意:使用接口方式实现时,任然需要设置点击事件。

AlertDialog

在当前页面弹出一个对话框,这个对话框在所有的界面元素之上,能够屏蔽掉其他控件的交互能力。

四种常见布局

LinearLayout

线性排列,其包含的所有控件都会在线性方向上依次排列。可以使用android:orientation指定排列的方向。

1
2
3
wrap_content:是layout_width和layout_height的属性值之一,表示和自身内容一样的长度。

match_parent:是layout_width和layout_height的属性值之一,表示和父组件一样的长度。
1
2
android:layout_weight
使用weight所占的总weight比例分配空间的大小。

RelativeLayout

相对布局,通过相对定位的方式让控件出现在布局的任何位置。

FrameLayout

所有的控件都会摆放在左上角。且容易多个控件挤成一坨。一般用于碎片。

TableLayout

使用表格的方式排列控件。

自定义控件

为了减少重复代码的书写,可以将重复的布局单独写在一个文件中,使用include调用自定义控件。

自定义控件的Java代码:

1
2
3
4
5
6
public class titleLayout extends LinearLayout {
public titleLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title,this);
}
}

注意:继承的类与自定义类的布局方式有关。

在调用控件时使用Java类的放式调用。

ListView控件

当数据量超过屏幕的长度时,可以通过屏幕上的滑动将原本处于屏幕外的数据调用到屏幕中,原本在屏幕中的数据调出屏幕。

ListView控件在Java文件中的调用:

1
2
3
4
5
6
7
8
9
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// android.R.layout.simple_list_item_1内置的ListView子项布局的id,里面只有一个TextView
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1,data);
ListView listViews = findViewById(R.id.list_view);
listViews.setAdapter(arrayAdapter);
}

适配器:

1、*Android中的ArrayAdapter(数组适配器)*

(1)、ArrayAdapter(数组适配器)的生成

1
ArrayAdapter<Strings>  adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);

分析以上程序代码可知:第一个参数this:表示上下文语境。第二个参数android.R.layout.simple_expandable_list_item_1:表示每一个item(列表项)的样式,可以使用系统提供的(如:simple_list_item1:单独一行文本框,simple_list_item2:两个文本框,simple_list_item_checked:每项都是由一个已选中的列表,simple_list_item_multiple_choice:都带有一个复选框,simple_list_item_single_choice:都带有一个单选框。),也可以自定义一个TextView(文本框)。第三个参数datas:表示数据源。

2、Android中的SimpleAdapter(简单适配器)

(1)、SimpleAdapter(简单适配器)的生成

1
SimpleAdapter simpleadapter = new SimpleAdapter(MainActivity.this,list_map,R.layout.list_item ,new String[]{"image","theme","content"} ,new int[]{R.id.image0,R.id.text0,R.id.text1})

分析以上程序代码可知:第一个参数this:表示上下文语境。第二个参数list:含有map的一个集合的数据源,第三个参数android.R.layout.list_item:表示ListView视图中每个item(列表项)控件的布局样式,不是布局文件activity_main.xml中ListView视图的样式。第四个参数new String[]{}数组:该数组里面的每一项表示每个控件的内容,且要与第二个参数中存入map集合的key值一样,要一一对应。第五个参数new int[]{}数组:该数组里面的每一项表示第三个参数中item(列表项)里面每个控件样式的id。

(2)、SimpleAdapter(简单适配器)一般把所携带的数据与图片通过调用setAdapter()方法来映射到ListView(列表视图)上。如下逻辑编程文件MainActivity.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
33
34
35
36
37
38
39
40
41
42
package com.qiang.simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity
{
private ListView listView;//定义ListView变量listview来获取布局文件中的ListView控件
private String[] theme = {"广州","深圳","北京","上海","香港","澳门"};//定义一个数组,用来作为数据源。
private String[] content ={"广州,你好!","深圳,你好!","北京,你好!", "上海,你好!","香港,你好!","澳门,你好!"};
private int[] image = {R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.five,R.drawable.six};//定义一个整形数组,用来作为数据源中的图像。
private List<Map<String,Object>> list_map = new ArrayList<Map<String,Object>>();//创建一个数组列 表对象
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);//获取布局文件activity_main.xml中的ListView控件
//准备好数据源,为listView循环添加数据。
for(int i=0;i<theme.length;i++)
{
Map<String,Object> items = new HashMap<String, Object>();//创建一个键值对的map集合,用来存放地方名字和内容和图像。
items.put("pictures", image[i]);//把图像放入map集合中
items.put("themes", theme[i]); //把地方名放入map集合中
items.put("contents",content[i]);//把内容放入map集合中
list_map.add(items);//把这个存放好数据的map集合放入到list中。
}
//创建简单适配器对象(可以使用外部类的方式、内部类方式等均可)
SimpleAdapter simpleadapter = new SimpleAdapter(MainActivity.this,/*传入一个上下文作为参数*/list_map,/*把数据源传到数组列表中*/R.layout.list_item, /*调用布局文件list_item.xml(含有多个列表项的布局)*/new String[]{"pictures","themes",“contents”}, /*传入图像数组、名称数组和内容数组,程序会自动根据传入的这三种数组来互相匹配。*/new int[]{R.id.images,R.id.text1,R.id.text2});/*调用布局文件list_item.xml(含有多个列表项的布局)中的控件*/
//把简单适配器所携带的数据与图像通过调用setAdapter()方法映射到ListView(列表视图)上
listView.setAdapter(simpleadapter);
}
}

3.自定义适配器

1
2
3
4
5
6
7
@Override  
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return null;
}

// 注意这里的converView是对之前加载好的布局的缓存,若不为空可以直接调用该布局,而不用浪费时间去重新加载布局。

制作Nine-patch图片

(17条消息) Android: 制作 Nine-Patch 图片(.9图片)_9patch android_JMW1407的博客-CSDN博客

  • 左方的黑线,指的是垂直方向的拉伸区域。垂直方向拉伸图片时,只有黑线区域内的图像会被拉伸,黑线两边的图像保持原状,这保证了上下两边的边框厚度不变。

  • 上方的黑线,指的是水平方向的拉伸区域。水平方向拉伸图片时,只有黑线区域内的图像会被拉伸,黑线两边的图像保持原状,这保证了左右两边的边框厚度不变。

  • 右方的黑线,指的是该图片作为控件背景时,控件内部的文字上下边界只能放在黑线区域内。这里Vertical Padding的效果就相当于android:paddingTop与android:paddingBottom。

  • 下方的黑线,指的是该图片作为控件背景时,控件内部的文字左右边界只能放在黑线区域内。这里Horizontal Padding的效果就相当于android:paddingLeft与android:paddingRight。

碎片

碎片的状态和回调

①运行状态
当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。

②暂停状态
当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),

与它相关联的可见碎片就会进入到暂停状态。

③ 停止状态
当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态。

或者通过调用FragmentTransaction 的remove()、replace()方法将碎片从活动中移除,

但有在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。

总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。

④销毁状态
碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。

或者通过调用FragmentTransaction 的remove()、replace()方法将碎片从活动中移除,

但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进入到销毁状态。