按钮
按钮的监听事件:
- 可以使用匿名类的方式实现。
- 可以直接实现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()方法,这时的碎片也会进入到销毁状态。