IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 实验3 Android界面组件 -> 正文阅读

[移动开发]实验3 Android界面组件

  • Android ListView的用法

?利用SimpleAdapter实现界面效果

首先,List View为列表视图,是一个视图组,它可以以滑动列表的方式展示项目。而列表项通过使用一个Adapter(适配器)来填充数据。适配器是数据和界面之间的桥梁。采用SimpleAdapter实现界面,因为其可以做一些简单的列表适配。

其次,SimpleAdapter的构造方法为:SimpleAdapter simpleAdapter? = new SimpleAdapter(this , listItems , R.layout.simple_item,new String[]{"personName","header","desc"},new int[]{R.id.name,R.id.header,R.id.desc});

listItems:是一个List<? extends Map<String,>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项

R.layout.simple_item:指定一个界面布局的ID,其意为:使用/layout/simple_item.xml文件作为列表项组件

new String[]{"personName","header","desc"}:一个String[]类型的参数,参数决定提取Map<String,?>对象中那些key对应的value来生成列表项

new int[]{R.id.name,R.id.header,R.id.desc}:决定填充哪些组件

0.将图片插入

1.先定义界面布局文件(activity_main.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="horizontal">
    <!--定义一个ListView-->
<!--divider:将控件之间隔开-->
<!--为了实现单击变色,使用ListView的listSelector属性-->
    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#000"
        android:dividerHeight="2dp"
        android:listSelector="#600" />
</LinearLayout>

2.MainActivity中创建SimpleAdapter

package com.example.androidlistview;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity
{
    private String[] names = new String[]{"Lion","Tiger","Monkey","Dog","Cat","Elephant"};
    private int[] imagesIds = new int[]{R.drawable.lion, R.drawable.tiger, R.drawable.monkey, R.drawable.dog, R.drawable.cat, R.drawable.elephant};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建一个List合集,List集合的元素是Map
        List<Map<String, Object>> listItems = new ArrayList<>();
        for (int i = 0; i < names.length;i++)
        {
            Map<String, Object> listItem = new HashMap<>();
            listItem.put("textview", names[i]);
            listItem.put("imageview", imagesIds[i]);
            listItems.add(listItem);
        }
        //创建一个SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.simple_item, new String[]{"textview", "imageview"}, new int[]{R.id.text, R.id.image});
        ListView list = findViewById(R.id.mylist);
        // 为ListView设置Adapter
        list.setAdapter(simpleAdapter);

}

}

3.在simple_item.xml中写入相应的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<!--定义一个TexView,用于作为列表项的一部分-->
    <TextView
        android:id="@+id/text"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:textSize="20sp"
        android:textColor="#000" />
<!--定义一个ImageView,用作列表项的一部分-->
    <ImageView
        android:id="@+id/image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:padding="10dp"/>
</LinearLayout>

4.因为需要监听用户单击某个列表项时间,添加setOnItemClickListener(),而且使用Toast显示选中的列表项信息

Toast:

Toast toast = Toast.makeText(MainActivity.this, names[position], Toast.LENGTH_SHORT);

第一个参数:当前的上下文环境。可用getApplicationContext()或者getContext()或this

第二个参数:要显示的字符串。也可是R.string中字符串ID

第三个参数:显示的时间长短。Toast默认的有两个LENGTH_LONG(长3.5秒)和LENGTH_SHORT(短2秒)

(ps.选中某个时间列表项为:setOnItemSelectedListenter())

// 为ListView的单击事件绑定事件监听器
??????? list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
??????????? @Override
??????????? public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
??????????????? // 创建一个Toast提示信息
??????????????? Toast toast = Toast.makeText(MainActivity.this, names[position], Toast.LENGTH_SHORT);
??????????????? toast.show();
??????????? }

得到结果:

?

  • 创建自定义布局的AlertDialog
AlertDialog.Builder的提供setView()方法接受View组件,可以随心所欲的订制对话框中的内容
1.先定义登录界面布局
activity_main.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="wrap_content"
        android:src="@drawable/header_logo"/>

    <EditText
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username"
        android:textSize="18dp" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password"
        android:textSize="18dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="#808080"
            android:dividerHeight="2dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:text="Cancel"
            android:textColor="#000000"
            android:textSize="15dp" />

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:divider="#808080"
            android:dividerHeight="2dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:text="Sign in"
            android:textColor="#000000"
            android:textSize="15dp" />
    </LinearLayout>
</LinearLayout>
2.调用AlertDialog.Builder的setView方法让对话框显示该输入界面
public void customView(View source)
{
    //加载布局文件
    TableLayout loginForm = (TableLayout) getLayoutInflater().inflate(R.layout.activity_main,null);
    //创建AlertDialog对象
    //AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
    new AlertDialog.Builder(this)
            .setView(loginForm)
            .create().show();

}

得到结果:

?

  • 使用XML定义菜单
1.在activity_main.xml中布局,TextView
<TextView
    android:id="@+id/txt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="12dp"
    android:textSize="18dp"
    android:text="用于测试的内容"/>

2.新建文件夹menu,在其中新建menu_main.xml和context.xml

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="字体大小">
        <menu>
            <!--            定义一组单选菜单-->
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/font_10"
                    android:title="10号字体"/>
                <item
                    android:id="@+id/font_16"
                    android:title="16号字体"/>
                <item
                    android:id="@+id/font_20"
                    android:title="20号字体"/>
            </group>
        </menu>
    </item>
    <!--    定义一个普通菜单项-->
    <item android:title="普通菜单项">

    </item>
    <item android:title="字体颜色">
        <menu>
            <!--            定义一组普通菜单项-->
            <group>
                <!--                定义三个菜单项-->
                <item
                    android:id="@+id/red_font"
                    android:title="红色"
                    />
                <item
                    android:id="@+id/black_font"
                    android:title="黑色"
                    />
            </group>
        </menu>
    </item>

</menu>

context.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 定义一组单选菜单项 -->
    <group android:checkableBehavior="single">
        <!-- 定义两个菜单项 -->
        <item
            android:id="@+id/red"
            android:title="红色"
            android:alphabeticShortcut="r"/>
        <item
            android:id="@+id/green"
            android:title="黑色"
            android:alphabeticShortcut="g"/>
    </group>
</menu>

3.在MainActibity.java中运用onCreateContextMenu方法和onCreateOptionsMenu方法加载菜单资源

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // 装填R.menu.menu_main对应的菜单,并添加到menu中
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return super.onCreateOptionsMenu(menu);
}
// 创建上下文菜单时触发该方法
@Override
public void onCreateContextMenu(ContextMenu menu, View source, ContextMenu.ContextMenuInfo menuInfo)
{
    // 装填R.menu.context对应的菜单,并添加到menu中
    getMenuInflater().inflate(R.menu.context, menu);
    menu.setHeaderTitle("请选择背景色");
}
@Override public boolean onOptionsItemSelected(MenuItem mi)
{
    // 勾选该菜单项
    if (mi.isCheckable())
    {
        mi.setChecked(true); // ②
    }
    // 判断点击的是哪个菜单项,并做出响应
    switch (mi.getItemId())
    {
        case R.id.font_10: txt.setTextSize(10 * 2); break;
        case R.id.font_16: txt.setTextSize(16 * 2); break;
        case R.id.font_20: txt.setTextSize(20 * 2); break;
        case R.id.red_font: txt.setTextColor(Color.RED); break;
        case R.id.black_font: txt.setTextColor(Color.BLACK); break;
        case R.id.plain_item:
            //点击之后弹出Toast提示
            Toast.makeText(MainActivity.this,
                    "您单击了普通菜单项", Toast.LENGTH_SHORT)
                    .show();
            break;
    }
    return true;
}

运行结果:

?

  • 创建上下文操作模式(ActionMode)的上下文菜单
    1.首先在activity_main中布局,采用线性布局
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="0dp">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/list_view"
            android:choiceMode="multipleChoiceModal"/>
    </LinearLayout>

    2.新建一个xml文件,将每个列表的样式布局出来,其中包括一个ImageView和TextView

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/android"/>
    <!--    alignParent相对于父元素的位置-->
        <TextView
            android:layout_width="200px"
            android:layout_height="50dp"
            android:gravity="center_vertical"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_marginEnd="44dp"
            android:layout_marginRight="44dp" />

    3.为了实现多选菜单,还应在上方设置选项菜单,新建menu文件夹,新建xml文件,action_mode.xml

    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!--app:showAsAction="always"意味这个菜单总是显示在界面上-->
    <item
        android:id="@+id/menu_all"
        app:showAsAction="always"
        android:icon="@drawable/all"
        android:title="item_all"/>
    <item
        android:id="@+id/menu_delete"
        app:showAsAction="always"
        android:icon="@drawable/delete"
        android:title="item_delete"/>

    4.对应每个选项的类item,记录是否被选中,如果被选中则为ture

    ??? //相应的set、get和toString方法
    ??? public String getName() {
    ??????? return name;
    ??? }
    ??? public void setName(String name) {
    ??????? this.name = name;
    ??? }

    ??? public boolean isBo() {
    ??????? return bo;
    ??? }
    ??? public void setBo(boolean bo) {
    ??????? this.bo = bo;
    ??? }

    ??? @Override
    ??? public String toString() {
    ??????? return "Item{" +
    ??????????????? "name='" + name + '\'' +
    ??????????????? ",bo=" + bo +
    ??????????????? '}';
    ??? }

    5.选用相应的适配器

    //定义BaseAdapter适配器
    public class Adapter extends BaseAdapter {
        List<Item> list;//item的list对象
        Context context;//上下文对象

    ......

    }

    //初始化
    public Adapter(List<Item> list, Context context) {
        this.context = context;
        this.list = list;
        //列表同步方法
        notifyDataSetChanged();
    }
    //创建内部类,定义每一个列表项所包含的东西,这里是每个列表项都有一个imageView和textView。
    class ViewHolder{
        ImageView imageView;
        TextView textView;
    }

    6.在主activity中填充数据,新建适配器且为ListView设置适配器。然后监听各自对应的点击事件。改变选中状态时要改变相应的item是否选中的属性,然后调用notifyDateSetChanged()方法刷新。

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
        // 调整选定条目
        if (checked == true) {
            list.get(position).setBo(true);
            //实时刷新
            adapter.notifyDataSetChanged();
            num++;
        } else {
            list.get(position).setBo(false);
            //实时刷新
            adapter.notifyDataSetChanged();
            num--;
        }
        // 用TextView显示
        mode.setTitle("  " + num + " Selected");
    }
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // 设置长按后所要显示的标题栏的内容
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.action_mode, menu);
        num = 0;
        adapter.notifyDataSetChanged();
        return true;
    
    }
    //在此方法中监听标题栏Menu的监听
                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    switch (item.getItemId()) {
                        //全选
                        case R.id.menu_all:
                            num = 0;
                            refresh();
                            adapter.notifyDataSetChanged();
                            mode.finish(); // 返回,结束多选模式
                            return true;
                        //删除
                        case R.id.menu_delete:
                            adapter.notifyDataSetChanged();
                            num = 0;
                            refresh();
                            mode.finish();
                            return true;
                        default:
                            refresh();
                            adapter.notifyDataSetChanged();
                            num = 0;
                            return false;
                    }
    
                }

    运行结果:

    ?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:59:21  更:2021-11-15 16:01:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:54:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码