积一时之跬步 , 臻千里之遥程
千里的路程都是从一步一步开始走的,无边无际的江河都是从一条条小溪汇聚而成的!「凡事不是一蹴而就的」。
一分耕耘,一分收获
希望在这里你们能收获到你们想要的。 「共勉」!
文章目录
第三章 界面控件
3.1 TextView以及子类
TextView的子类: CheckedTextView、EditText、Button。
Button的子类:CheckBox,RadioButton
3.1.1 常用属性:
single:单行模式
ellipsize:设置文字缩略方式
值为marquee时,需要配合marqueeRepeatLimit、focusable、focusableInTouchMode属性实现文字滚动效果
autoLink:设置文本内容中的邮箱、电话等链接
background:默认情况下,TextView是不带边框的,如果想设置边框,需要为TextView设置一个背景图片,该图片只是一个边框。 为文本框设置背景资源,背景图片可以使用shape资源文件作为图片使用
3.1.2 shape资源文件属性:
(1)stroke :边框效果 相当于html中的盒子模型的border
属性: android:width:描边的宽度
android:color:描边的颜色
android:dashWidth:表示边框的样式是虚线的宽度,
值为0时,表示为实线。
值大于0则为虚线。
android:dashGap :表示描边为虚线时, 虚线之间的间隔 即"- - - "
(2)padding :内部边距,即内容与边的距离
属性: android:left :左内边距
android:top :上内边距
android:right:右内边距
android:bottom :下内边距
(3)corners : 圆角
属性:android:radius:半径
android:topLeftRadius :左上角半径
android:topRightRadius :右上角半径
android:bottomLeftRadius :右下角半径
android:bottomRightRadius :左下角半径
(4)solid :内部填充
属性 android:color :填充颜色
(5)gradient : 渐变色
属性: android:startColor : 起始颜色
android:endColor :结束颜色
android:centerColor :渐变中间颜色
android:angle :渐变角度(PS:当angle=0时,渐变色是从左向右。
然后逆时针方向转,当angle=90时为从下往上。angle必须为45的
整数倍)
属性: android:type : 渐变类型(取值:linear、radial、sweep)
linear :线性渐变,这是默认设置
radial :放射性渐变,以开始色为中心。
sweep : 扫描线式的渐变。
android:gradientRadius :渐变色半径.当 android:type=“radial” 时才使用。单独使用 android:type="radial"会报错。
属性 android:useLevel :如果要使用LevelListDrawable对象,就要设置为true。设置为true无渐变。false有渐变色
android:centerX : 渐变中心X点坐标的相对位置
android:centerY : 渐变中心Y点坐标的相对位置
3.1.3 CheckedTextView:
继承了TextView,增加了check功能
属性:
*android:checked=“true” :是否被选
*android:checkMark=“?android:attr/listChoiceIndicatorMultiple”: 设置勾选状态
*android:clickable=“true”:是否可以被点击
注意:添加CheckedTextView的OnClickListener事件。
在onClick方法中调用toggle()方法:用于切换选择的状态
Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,它显示在应用程序界面的最上层,显示一段时间后自动消失不会打断当前操作,也不获得焦点。
例如:
private CheckedTextView ch_tv;
ch_tv=findViewById(R.id.ch_tv);
ch_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//状态切换
ch_tv.toggle();
if(ch_tv.isChecked())
Toast.makeText(TvActivity.this,"音效已开启",Toast.LENGTH_LONG).show();
else
Toast.makeText(TvActivity.this,"音效已关闭",Toast.LENGTH_LONG).show();
}
});
<CheckedTextView
android:id="@+id/ch_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:checked="false"
android:clickable="true"
android:text="是否打开音效"
android:textSize="30sp"
/>
3.1.4 文本框(EditText)
–EditText:继承了TextView,可以编辑内容的文本框
–EditText组件的常用属性:
3.1.5 按钮及点击事件(Button)
–Button控件表示按钮,它继承自TextView控件,既可以显示文本,又可以显示图片,同时也允许用户通过点击来执行操作,当Button控件被点击时,被按下与弹起的背景会有一个动态的切换效果,这个效果就是点击效果 。
Button的四种点击事件的实现方式
3.1.6 背景选择器(selector)
Button的点击效果:
–通过background属性实现
①使用selector文件实现Button点击和释放是显示不同效果
②该属性可以是颜色,静态图片和shape的边框文件。但是这情况下单击按钮不会出现任何效果。
–selector定义的基本格式:
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected=“true”
android:drawable="@color/color1"/>
<item android:state_focused="true"
android:drawable="@color/color2" />
<item android:state_pressed="true"
android:drawable="@color/color3“/>
<item android:drawable="@color/color1" />
</selector>
–selector使用注意事项:
①每个item对应一种状态
②在定义selector的时候,根据不同的目的,选择不同的item属性,例如,为了定义组件的背景,需要使用android:drawable
③statelist中第一个匹配当前状态的item会被使用。因此,如果第一个item没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后
3.1.7 单选框(RadioButton)
–RadioButton为单选按钮,android:checked属性指定是否选中的状态。
–RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。
–语法格式
<RadioGroup
android:属性名称 ="属性值"
......>
<RadioButton
android:属性名称 ="属性值"
....../>
......
<RadioGroup/>
例:
xml文件:
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:textSize="25sp"
/>
<RadioButton
android:id="@+id/women"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
android:textSize="25sp" />
</RadioGroup>
单选点击事件:
private RadioGroup radioGroup;
radioGroup=findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId==R.id.man)
Toast.makeText(TvActivity.this,"你选择的性别为:男",Toast.LENGTH_LONG).show();
if(checkedId==R.id.women)
Toast.makeText(TvActivity.this,"你选择的性别为:女",Toast.LENGTH_LONG).show();
}
});
3.1.8 复选框(CheckBox)
–CheckBox表示复选框,它是Button的子类,用于实现多选功能,通过android:checked属性指定CheckBox控件是否选中的状态。
private CheckBox checkBox1;
final Set<String> hoppy = new HashSet<String>();
checkBox1= findViewById(R.id.yu);
checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
hoppy.add("羽毛球");
else
hoppy.remove("羽毛球");
Toast.makeText(TvActivity.this,"你的爱好是:"+hoppy,Toast.LENGTH_LONG).show();
}
});
xml文件:
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="羽毛球"
android:id="@+id/yu"/>
换种写法:
private String hobbys;
private TextView hobby;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checkbox);
CheckBox checkBox1 = findViewById(R.id.checkbox1);
CheckBox checkBox2 = findViewById(R.id.checkbox2);
CheckBox checkBox3 = findViewById(R.id.checkbox3);
hobby = findViewById(R.id.hobby);
checkBox1.setOnCheckedChangeListener(this);
checkBox2.setOnCheckedChangeListener(this);
checkBox3.setOnCheckedChangeListener(this);
hobbys = new String();
}
@Override
public void onCheckedChanged(CompoundButton bottonView, boolean b) {
String text = bottonView.getText().toString();
if (b) {
if (!hobbys.contains(text)) {
hobbys = hobbys + text;
hobby.setText(hobbys);
}
} else {
if(hobbys.contains(text)){
hobbys = hobbys.replace(text,"");
hobby.setText(hobbys);
}
}
}
xml文件:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择兴趣爱好"
android:textColor="#FF8000"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox1"
android:text="羽毛球"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox2"
android:text="篮球"
android:textSize="18sp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox3"
android:text="乒乓球"
android:textSize="18sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF8000"
android:textSize="22sp"
android:text="您选择的兴趣爱好为:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/hobby"
android:textSize="18sp"
/>
3.2 ImageView以及子类
ImageView表示图片,它继承自View,可以加载各种图片资
源。
3.2.1 ImageButton
ImageButton显示图片,它继承自ImageView,拥有
ImageView的属性和方法,不过ImageButton有默认的按钮
外观。
在ImageButton中载入图片后,图片周围有白边,影响到美观。解决这个问题的方法有两种:
•一种方法是将ImageButton的背景改为所需要的图片。
如:android:background="@drawable/XXX"
•第二种方法就是将ImageButton背景改为透明, 这个方法更常用。在XML里;
<ImageButton android:background="#00000000" …/>
例如:
private ImageButton imageButton;
private ImageView imageView;
private int[] images={R.drawable.dog4,R.drawable.dog3,R.drawable.dog2,R.drawable.dog1};
private int count = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_image);
imageButton = findViewById(R.id.Image_button);
imageView = findViewById(R.id.Image_View);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(count==3) count = -1;
imageView.setImageResource(images[++count]);
}
});
}
xml:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/dog1"
android:id="@+id/Image_View"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/start"
android:id="@+id/Image_button"
android:background="#00000000"
/>
3.3 AdapterView以及子类
继承了ViewGroup,可以包含其他组件
可以包括多个列表项,并将多个列表项以合适的形式显示出来
抽象类。
–AdapterView的子类
*AbsListView:ListView,GridView
*AbsSpinner:Spinner,Gallery
3.3.1 ListView
正如它的名字,一般用于展示列表。比如要展示数据库中的N条
纪录,或是列出某个目录下的文件等
–ListView采用典型的MVC模式来分离视图和数据,将数据封装
在Adapter中,而ListView负责显示数据。
ListView的实现方式:
使用entries属性实现
使用ArrayAdapter实现
使用SimpleAdapter实现
使用BaseAdapter实现
使用LivstActivity实现
(1)使用entries属性实现(下面几种基于此页面实现)
activity:
public class DemoListView extends AppCompatActivity {
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_listview);
list = findViewById(R.id.list_view);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
//Activity切换
startActivity(new Intent(DemoListView.this,ArrayAdapterActivity.class));
break;
case 1:
startActivity(new Intent(DemoListView.this,SimpleAdapterActivity.class));
break;
case 2:
startActivity(new Intent(DemoListView.this,BaseAdapterActivity.class));
break;
case 3:
startActivity(new Intent(DemoListView.this,List4Activity.class));
break;
}
}
});
}
}
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/arr"
android:divider="#111111"
android:dividerHeight="3dp"
android:listSelector="@drawable/selector1"
android:id="@+id/list_view"
>
</ListView>
arrays.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arr">
<item>张三</item>
<item>李四</item>
<item>王五</item>
<item>赵六</item>
<item>齐齐</item>
<item>刘八</item>
</string-array>
</resources>
selector1.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/green" android:state_pressed="true">
</item>
<item android:drawable="@drawable/pink" android:state_pressed="false">
</item>
</selector>
效果图:
(2)使用ArrayAdapter实现
ArrayAdapter的数据源仅仅是数组,但可以设置数据的显示布局。开发者只需要在构造方法里面传入相应参数即可。ArrayAdapter通常用于适配TextView控件。
–ArrayAdapter的构造方法如下:
例:主页面使用entries属性实现,然后通过点击事件实现跳转
public class ArrayAdapterActivity extends AppCompatActivity {
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_listview1);
String[] data = {"平顶山","郑州","开封","洛阳","南阳"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked,data);
list = findViewById(R.id.list_view1);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
list.setAdapter(adapter);
}
}
xml文件:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#111111"
android:dividerHeight="3dp"
android:id="@+id/list_view1">
</ListView>
(3)使用SimpleAdapter实现
–SimpleAdapter数据源不仅仅是数组,还可以是其他类型的数据。因此在使用SimpleAdapter进行数据适配时,只需要在构造方法中传入相应的参数即可。SimpleAdapter的构造方法的具体信息如下
例:
xml文件1:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_view2"
>
</ListView>
xml文件2:
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/head1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#C900A5"
android:id="@+id/name1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:id="@+id/desc1"
/>
</LinearLayout>
activity:
public class SimpleAdapterActivity extends AppCompatActivity {
private ListView list2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_simple2_1);
//创建数据
User u1 = new User(R.drawable.head3,"虎头","一个可爱的小孩");
User u2 = new User(R.drawable.head1,"弄玉","一个擅长音乐的女孩");
User u3 = new User(R.drawable.head2,"李清照","一个擅长文学的女性");
User u4 = new User(R.drawable.head4,"李白","一个浪漫的诗人");
List<Map<String,Object>> data = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
map1.put("head",u1.getHead());
map1.put("name",u1.getName());
map1.put("desc",u1.getDesc());
Map<String,Object> map2 = new HashMap<>();
map2.put("head",u2.getHead());
map2.put("name",u2.getName());
map2.put("desc",u2.getDesc());
Map<String,Object> map3 = new HashMap<>();
map3.put("head",u3.getHead());
map3.put("name",u3.getName());
map3.put("desc",u3.getDesc());
Map<String,Object> map4 = new HashMap<>();
map4.put("head",u4.getHead());
map4.put("name",u4.getName());
map4.put("desc",u4.getDesc());
data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
SimpleAdapter simpleAdapter =
new SimpleAdapter(this,data,R.layout.layout_simple2_2,
new String[]{"head","name","desc"},new int[]{R.id.head1,R.id.name1,R.id.desc1});
list2 = findViewById(R.id.list_view2);
list2.setAdapter(simpleAdapter);
}
}
(4)使用BaseAdapter实现
–BaseAdapter顾名思义是基本的适配器。他实际上是一个抽象
类,通常在自定义适配器时会继承BaseAdapter。
–BaseAdapter中的方法
–获得 LayoutInflater 实例的方式
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用 Activiyt.findViewById()方法来获得其中的界面元素。
–获得 LayoutInflater 实例的方式
1.LayoutInflater inflater = getLayoutInflater();
//调用Activity的getLayoutInflater()
2.LayoutInflater localinflater =
(LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
3.LayoutInflater inflater = LayoutInflater.from(context);
例:
xml文件1:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_view3"
>
</ListView>
xml文件2:
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/head1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#C900A5"
android:id="@+id/name1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:id="@+id/desc1"
/>
</LinearLayout>
activity:
public class BaseAdapterActivity01 extends BaseAdapter {
private Context context;
private List<User> data;
//实例化xml文件的对象
private LayoutInflater Inflater;
public BaseAdapterActivity01(Context context, List<User> data) {
this.context = context;
this.data = data;
Inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
View v;
if (convertView == null) {
v = Inflater.inflate(R.layout.layout_simple2_2, viewGroup, false);
} else {
v = convertView;
}
//显示数据
User u = data.get(position);
ImageView image = v.findViewById(R.id.head1);
image.setImageResource(u.getHead());
TextView tv1 = v.findViewById(R.id.name1);
tv1.setText(u.getName());
TextView tv2 = v.findViewById(R.id.desc1);
tv2.setText(u.getDesc());
return v;
}
}
public class BaseAdapterActivity extends AppCompatActivity {
private ListView list3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_base3);
list3 = findViewById(R.id.list_view3);
//创建自定义的适配器
List<User> data = new ArrayList<>();
//创建数据
User u1 = new User(R.drawable.head3,"虎头","一个可爱的小孩");
User u2 = new User(R.drawable.head1,"弄玉","一个擅长音乐的女孩");
User u3 = new User(R.drawable.head2,"李清照","一个擅长文学的女性");
User u4 = new User(R.drawable.head4,"李白","一个浪漫的诗人");
data.add(u1);
data.add(u2);
data.add(u3);
data.add(u4);
BaseAdapterActivity01 base = new BaseAdapterActivity01(this,data);
list3.setAdapter(base);
}
}
(5)使用LivstActivity实现
–1.ListActivity默认布局中具有ListView,就可以不用指定布局文件。调用setListAdapter为其指定适配器。也可以自定义布局方式,需要手动在布局文件中添加id为@android:id/list的ListView控件
–2.调用setListAdapter为其指定适配器。
android.R.layout.simple_list_item_2:显示两个文本框的布
局,当ListView中的数据为空时,显示其他的组件,如下例:
指定该组件的id号为@android:id/empty
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No items."/>
例:
xml文件:
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@android:id/list">
</ListView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@android:id/empty"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加联系人"/>
activity:
public class List4Activity extends ListActivity {
private String[] names={"张三","李四","王五","赵六"};
private String[] phone={"13949983175","18317617022","15660097813","12345678912"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_list4);
List<Map<String,Object>> data = new ArrayList<>();
for(int i=0;i<names.length;i++){
Map<String,Object> map =new HashMap<>();
map.put("names",names[i]);
map.put("phone",phone[i]);
data.add(map);
}
SimpleAdapter simpleAdapter =new SimpleAdapter(this,data,
android.R.layout.simple_expandable_list_item_2,new String[]{"names","phone"},
new int[] {android.R.id.text1,android.R.id.text2});
setListAdapter(simpleAdapter);
}
}
3.3.2 Spinner控件
-
Spinner与ListView一样,也是AdapterView的一个间接子类,是一个显示数据的窗口。
-
Spinner是一种能够从多个选项中选一选项的控件,类似于桌面程序的组合框(ComboBox),但没有组合框的下拉菜单,而是使用浮动菜单为用户提供选择
-
Spinner的数据源和ListView相同,数据可以来自自定义数组,list,数据库和内容提供者。
-
也是使用setAdapter()来提供数据和视图的适配器
Spinner(下拉式列表)应用场合
Spinner的常用属性:
-
android:spinnerMode决定下拉方式
Dialog方式会产生一个对话框
Dropdown方式则在控件下方产生一个选择区域(默认)
-
entries:设置显示数组数据。
dropDownWidth:设置下拉列表的宽度。
android:dropDownSelector:设置Spinner组件的下拉框被选择的动态效果属性。
popupBackground:下拉框的背景 -
当选中某个选项的时候,触发的是onItemSelect选项
-
onItemClick不能在spinner中使用
例:实现简单省、市级联
选择省份,会自动根据省份选择该省份所有的市,这边分别使用android:spinnerMode的两种属性展示
public class Spinner_Demo extends AppCompatActivity { private Spinner spinner1; private Spinner spinner2; private ArrayAdapter<String> arrayAdapter1; private ArrayAdapter<String> arrayAdapter2; private String[] province={"河南省","河北省","湖北省"}; private String[][] citys={{"郑州市","周口市","许昌市","洛阳市"},{"唐山市","石家庄市","保定市"}, {"武汉市","咸宁市","黄山市"}}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinner); spinner1 = (Spinner)findViewById(R.id.spinner1); spinner2 = (Spinner) findViewById(R.id.spinner2); //省的适配器绑定 arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,province); spinner1.setAdapter(arrayAdapter1); //市的适配器绑定 arrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); spinner2.setAdapter(arrayAdapter2); //监听省的Spinner选项的选择 spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int i, long id) { //根据省的选择i来改变市的数据 String [] city=citys[i]; //适配器清零 arrayAdapter2.clear(); //添加市的数据 arrayAdapter2.addAll(city); spinner2.setSelection(0); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } }
xml文件:
<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请选择地址:" android:textSize="30sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="省:" android:textSize="20sp" /> <Spinner android:id="@+id/spinner1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:spinnerMode="dropdown"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="市:" android:textSize="20sp" /> <Spinner android:id="@+id/spinner2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:spinnerMode="dialog"/> </LinearLayout> </LinearLayout>
3.3.3 GridView控件
-
GridView控件可以为我们提供一个可供选择的二维选项网络,开发人员可以控制网格的列的数量和宽度;行的数量是基于适配器提供的选项数,在确保有效的显示的条件下动态确定的
-
GridView用于在界面上按行,列分布的方式来显示多个组件
-
使用Adapter,会按照指定的列数逐一摆放空间,慢列后换行
-
与ListView区别:ListView只显示一列,而GridView可以显示多列。
例:点击图片会变大,效果略
public class GridViewActivity extends AppCompatActivity {
private ImageView image;
private GridView gridView;
private int[] images ={R.drawable.head1,R.drawable.head2,R.drawable.head3,R.drawable.head4,
R.drawable.head5,R.drawable.head6};
private String[] desc={"图片1","图片2","图片3","图片4","图片5","图片6"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_gridview1);
gridView=findViewById(R.id.gridview);
List<Map<String,Object>> data = new ArrayList<>();
for(int i=0;i<desc.length;i++){
Map<String,Object> map =new HashMap<>();
map.put("images",images[i]);
map.put("desc",desc[i]);
data.add(map);
}
SimpleAdapter simpleAdapter =new SimpleAdapter(this,data,
R.layout.layout_gridview2,new String[]{"images","desc"},
new int[] {R.id.grid_image,R.id.grid_desc});
gridView.setAdapter(simpleAdapter);
image=findViewById(R.id.iamge_big);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
image.setImageResource(images[position]);
}
});
}
}
layout_gridview.xml
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<GridView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/grid1"
android:numColumns="4"
></GridView>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/image_big"
/>
</LinearLayout>
layout_test.xml
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/image1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/text1"
/>
</LinearLayout>
3.3.4 Gallery控件
- Gallery(画廊视图)
与Spinner组件很相似。他们之间的区别:Spinner是一个垂直的列表选择框,而Gallery是一个水平的列表框;以及Spinner的作用是供用户选择,而Gallery允许用户通过拖动来查看上一个,下一个列表项。
- xml布局文件中的配置:
<Gallery
android:id="@+id/Gallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content“/>
-
Gallery的常用属性:
android:animationDuration:设置图片切换的动画持续时间。
android:unselectedAlpha="0.3"设置没有选中的图片的透明度。
android:spacing="2pt"设置图片之间的间距。
例:图片滑动出现,并且放大
activity:
public class GalleryActivity extends AppCompatActivity {
private Gallery gallery;
private ImageView imageView;
private int[] images ={R.drawable.head1,R.drawable.head2,R.drawable.head3,R.drawable.head4,
R.drawable.head5,R.drawable.head6};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_gallery1);
gallery=findViewById(R.id.gallery);
List<Map<String,Object>> data = new ArrayList<>();
for(int i=0;i<images.length;i++){
Map<String,Object> map = new HashMap<>();
map.put("image",images[i]);
data.add(map);
}
SimpleAdapter simpleAdapter= new SimpleAdapter(this,data,R.layout.layout_gallery_test
,new String[] {"image"},new int[] {R.id.images});
gallery.setAdapter(simpleAdapter);
imageView=findViewById(R.id.gallery_image);
gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
imageView.setImageResource(images[i]);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
}
layout_gallery1.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="match_parent"
android:layout_height="300dp"
android:id="@+id/gallery_image"
/>
<Gallery
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/gallery"
android:spacing="5dp"
android:unselectedAlpha="0.3"></Gallery>
</LinearLayout>
layout_gallery_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/images"
/>
</LinearLayout>
3.4 Toast信息提醒机制
例:
//TvActivity 当前activity
Toast.makeText(TvActivity.this,"音效已开启",Toast.LENGTH_LONG).show();
3.5 AlertDialog对话框
—Android提供了4种常用的对话框:
- AlertDialog:功能最丰富,实际应用最广的对话框,最常用的。
- ProgressDialog:进度对话框,这个对话框只是对简单进度条的封装。
- DatePickerDialog:日期选择对话框,这个对话框只是对DatePicker的包装。
- TimePickerDialog:时间选择对话框,这个对话框只是对TimePicker的包装
—AlterDialog使用步骤:
- 调用AlertDialog.Builder相关方法设置显示内容,包括:
- setMessage:设置最简单的文本提示信息。
- setItems:设置内容为简单列表项, 调用该方法时需要传入一个数组 或者数组资源的资源ID。
- setSingleChoiceItems:设置内容为单选的列表项,可以传入数组,资源id,Cursor,ListAdapter作为参数。
- setMultiChoiceItems:设置内容为多选的列表项。
- setAdapter:设置内容为自定义列表项。
- setView:设置内容为任意类型的View,完成一个登录对话框的界面。
—AlterDialog其他常用方法:
- setCancelable(false):设置是否可以取消对话框,默认为true,点击按钮,回退健或者点击任何一个地方都会关闭对话框。需要在create之前调用。
- AlertDialog.dismiss():取消对话框。
- AlertDialog.cancel():取消对话框。
3.5.1 普通对话框
内容区域一般显示简单的文本信息,通过**setMessage()**方法设置。
例:返回的时候弹出界面
@Override
public void onBackPressed() {
//super.onBackPressed();返回上一个界面
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("普通对话框")
.setMessage("是否确定退出应用")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
commonDialogActivity.this.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
3.5.2 单选对话框
单选对话框的内容区域显示为单选列表,单选列表通过AlertDialog.Builder对象调用**setSingleChoiceItems()**方法设置。
例:
public class StringleChoiceDialog extends AppCompatActivity implements View.OnClickListener {
private int textsize = 1;
private int[] textsizeArr = {10, 20, 25, 30, 40};
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stringlechoicedialog);
textView = findViewById(R.id.tv);
Button button = findViewById(R.id.bt);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("单选对话框")
.setSingleChoiceItems(new String[]{"小号", "默认", "中号", "大号", "超大"}, textsize, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
textsize = i;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
int size = textsizeArr[textsize];
textView.setTextSize(size);
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
3.5.3 多选对话框
多选对话框的内容区域显示为多选列表,多选列表通过AlertDialog.Builder对象调用**setMultiChoiceItem()**方法设置的
例:
public class MultichChoiceDialog extends AppCompatActivity implements View.OnClickListener {
private CharSequence[] items = new CharSequence[]{"旅游","美食","看电影","运动"};
private boolean[] checkedItems = new boolean[]{false,true,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multichchoicedialog);
findViewById(R.id.bt).setOnClickListener(this);
}
@Override
public void onClick(View view) {
AlertDialog alertDialog;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("请选择兴趣爱好")
.setMultiChoiceItems(items, checkedItems,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int j, boolean b) {
checkedItems[j] = b;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
StringBuffer stringBuffer = new StringBuffer();
for(int i = 0 ;i<=checkedItems.length-1;i++){
if(checkedItems[i]){
stringBuffer.append(items[i]).append("");
}
}
if(stringBuffer!=null){
Toast.makeText(MultichChoiceDialog.this," "+stringBuffer,
Toast.LENGTH_SHORT).show();
}
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
3.5.4 自定义对话框
在Android程序中由于界面风格的不同,一般不直接使用系统提供的对话框,而是根据项目需要定义相应的对话框样式
例:
CustomDialogActivit类:
public class CustomDialogActivity extends AlertDialog {
private TextView titleTv;//显示的标题
private TextView messageTv;//显示的是信息
private Button negtiveBn, positiveBn;//确认和消息按钮
private String message;
private String title;
private String positive, negtive;//确定,取消
public CustomDialogActivity setMessage(String message) {
this.message = message;
return this;
}
public CustomDialogActivity setTitle(String title) {
this.title = title;
return this;
}
public CustomDialogActivity setPositive(String positive) {
this.positive = positive;
return this;
}
public CustomDialogActivity setNegtive(String negtive) {
this.negtive = negtive;
return this;
}
protected CustomDialogActivity(@NonNull Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_dialog);
initView();
initEvent();
}
//初始化界面
private void initView() {
titleTv = (TextView) findViewById(R.id.title);
messageTv = (TextView) findViewById(R.id.message);
negtiveBn = (Button) findViewById(R.id.negtive);
positiveBn = (Button) findViewById(R.id.positive);
}
//设置点击确定按钮和取消按钮的监听器
public interface OnClickBottomListener {
void onPositivateClick();//实现确定按钮点击事件的方法
void onNegtiveClick();//确定取消按钮点击事件的方法
}
//设置确定取消按钮的回调
public OnClickBottomListener onClickBottomListener;
public CustomDialogActivity setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
//初始化界面的确定和取消监听器
private void initEvent() {
//设置确定按钮的点击事件的监听器
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onClickBottomListener != null) {
onClickBottomListener.onPositivateClick();
}
}
});
//设置取消按钮的点击事件的监听器
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onClickBottomListener != null) {
onClickBottomListener.onNegtiveClick();
}
}
});
}
private void refreshView() {
//如果自定义了title和message会显示自定义的信息,否则不显示title和message的信息
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title); //设置标题控件的文本为自定义的title
titleTv.setVisibility(View.VISIBLE); //标题控件设置为显示状态
} else {
titleTv.setVisibility(View.GONE);//标题控件设置为隐身状态
}
if (!TextUtils.isEmpty(message)) {
messageTv.setText(message); //设置消息控件的文本自定义的message信息
}
//如果自定义了按钮的文本,则按钮显示自定义的文本,否则,按钮显示“确定”或“取消”文本
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive); //设置按钮的文本为自定义的文本是信息
} else {
positiveBn.setText("确定"); //设置按钮文本为“确定”
}
if (!TextUtils.isEmpty(negtive)) {
negtiveBn.setText(negtive);
} else {
negtiveBn.setText("取消");
}
}
public void show() {
super.show();
refreshView();
}
}
CustomDialog类:
public class CustomDialog extends AppCompatActivity implements View.OnClickListener {
private RadioGroup radioGroup;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customdialog);
findViewById(R.id.btn_dialog).setOnClickListener(this);
}
@Override
public void onClick(View view) {
final CustomDialogActivity customDialogActivity = new CustomDialogActivity(CustomDialog.this);
customDialogActivity.setTitle("提示");
customDialogActivity.setMessage("您确定要删除信息?");
customDialogActivity.setNegtive("取消");
customDialogActivity.setPositive("确定");
customDialogActivity.setOnClickBottomListener(new CustomDialogActivity.OnClickBottomListener() {
@Override
public void onPositivateClick() {
//确定按钮
customDialogActivity.dismiss();
}
@Override
public void onNegtiveClick() {
//取消按钮
customDialogActivity.dismiss();
}
});
customDialogActivity.show();
}
}
3.5.5 自定义适配器对话框
–自定义适配器对话框是使用**setAdapter()**方法设置的。
例:xml文件略!
主要代码:
//创建自定义适配器对话框
List<Map<String ,Object>> data = new ArrayList<>();
for (int j =0;j<images.length;j++){
Map<String,Object> map = new HashMap<>();
map.put("images",images[j]);
map.put("name",names[j]);
map.put("descs",descs[j]);
data.add(map);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(DialogDemoActivity.this,data,R.layout.layout_test,
new String[]{"images","name","descs"},new int[]{R.id.head2,R.id.name2,R.id.desc2});
new AlertDialog.Builder(DialogDemoActivity.this)
.setTitle("自定义适配器对话框")
.setAdapter(simpleAdapter,null)
.show();
3.5.6 自定义View对话框
使用的是**setView()**方法实现的
例:xml文件略,自己设计界面
主要代码:
//创建自定义视图对话框
View view1= getLayoutInflater().inflate(R.layout.layout_login,null);
new AlertDialog.Builder(DialogDemoActivity.this)
.setTitle("提示信息")
.setView(view1)
.show();
后续笔记会持续更新,希望大家给个一键三连!!!!!
点击前往总目录