Android 按钮、界面控件、对话框(三)

积一时之跬步 , 臻千里之遥程

千里的路程都是从一步一步开始走的,无边无际的江河都是从一条条小溪汇聚而成的!「凡事不是一蹴而就的」

一分耕耘,一分收获
希望在这里你们能收获到你们想要的。 「共勉」

🍅点击查看Android总结文章总目录

第三章 界面控件

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,可以加载各种图片资
源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cs5PZyFa-1634974084323)(C:\Users\Administrator\Pictures\img\image-20211014141822489.png)]

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中的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C1YCgd4b-1634974084333)(C:\Users\Administrator\Pictures\img\image-20211014154138431.png)]
–获得 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();

后续笔记会持续更新,希望大家给个一键三连!!!!!
点击前往总目录
在这里插入图片描述

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mylife0506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值