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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android入门系列(二):布局管理器和基本组件 -> 正文阅读

[移动开发]Android入门系列(二):布局管理器和基本组件

一、布局管理器

1.线性布局LinearLayout

线性布局的每一列只能放置一个组件,且组件超出了屏幕内容不会换行

可设定的属性:

orientation:布局内元素的排列方式,horizontal横排(默认),vertical竖排

gravity:布局内元素的位置,可以使用 | 连接,有top,bottom,left,right属性

layout_width和layout_height:布局的宽度和高度,有match_parent=fill_parent最大,wrap_content布局内元素的最大

id:唯一标识

background:背景颜色,可以使用@来引用,也可以直接使用十六进制

2.表格布局TableLayout

表格布局继承了线性布局

先看代码和效果

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:stretchColumns="0,3">

    <TableRow
        android:id="@+id/row1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView/>
        <TextView
            android:text="用户名:"
            android:textSize="100px">

        </TextView>
        <EditText
            android:textSize="100px"
            android:minWidth="300px">
        </EditText>
        <TextView/>
    </TableRow>
    <TableRow
        android:id="@+id/row2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView/>
        <TextView
            android:text="密码:"
            android:textSize="100px">

        </TextView>
        <EditText
            android:textSize="100px"
            android:minWidth="300px"
            android:inputType="textPassword">
        </EditText>
        <TextView/>
    </TableRow>
    <TableRow>
        <TextView/>
        <Button
            android:id="@+id/button1"
            android:layout_width="100px"
            android:layout_height="wrap_content"
            android:text="登录"
            android:textSize="80px"
            >
        </Button>
        <Button
            android:id="@+id/button2"
            android:layout_width="100px"
            android:layout_height="wrap_content"
            android:text="注册"
            android:textSize="80px">
        </Button>
        <TextView/>
    </TableRow>

</TableLayout>

具体说下里面的属性

在TableLayout的大标签下面,每一个TableRow代表一行,gravity表示为内部这几个row的位置

stretchColumns表示需要在哪些位置伸展为空的内容,这里写的0、3,即为数组的1和4的位置为空,即红框这一部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJN1f7uP-1637497191561)(C:\Users\Michilay\AppData\Roaming\Typora\typora-user-images\image-20211117220204975.png)]

测试之后发现其实使用gravity=center的属性可以替代拉伸

EditText里可以用inputType属性来更改输入的文本类型

3.帧布局管理器FrameLayout

帧布局就是指将屏幕分为一个个空白的区域,每一个区域为一帧,默认从左上角开始,且后面的组件会覆盖掉之前的组件

foreground设置前景图像的属性,foregroundGravity前景图像的位置

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="@drawable/ic_launcher_background"
    android:foregroundGravity="center|top">

    <TextView
        android:layout_width="800px"
        android:layout_height="800px"
        android:background="@color/black"
        android:layout_gravity="center"/>
    <TextView
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="@color/white"
        android:layout_gravity="center"/>
    <TextView
        android:layout_width="300px"
        android:layout_height="300px"
        android:background="@color/black"
        android:layout_gravity="center"/>

</FrameLayout>

其中layout_gravity表示的是容器本身位于父容器的位置,可用 | 连接

效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvlswFEC-1637497191564)(C:\Users\Michilay\AppData\Roaming\Typora\typora-user-images\image-20211118105244317.png)]

4.相对布局RelativeLayout

基本属性:

? gravity设置容器内组件的对齐方式,

? ignoreGravity设置该属性为true的组件不受gravity属性的影响

根据父容器定位:

? layout_alignParentLeft的属性为true表示左对齐父容器,还有Right,Top,Bottom,

? android:layout_centerHorizontal为true表示在父容器中水平居中,还有Vertical垂直居中,以及InParent居中

根据兄弟容器定位:

? layout_toLeftOf设定id属性即放在这个id对象的左边,同类型的还有layout_toRightOf,layout_above,layout_below,效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WJ33SZdE-1637497191567)(C:\Users\Michilay\AppData\Roaming\Typora\typora-user-images\image-20211118112323208.png)]

? layout_alignLeft即和该参考组件的左边界对其,同类型还有layout_alignBottom,layout_alignLeft,layout_alignRight,效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wX0SN749-1637497191569)(C:\Users\Michilay\AppData\Roaming\Typora\typora-user-images\image-20211118112550387.png)]

? margin设置偏移量,指和父容器的偏移量,有layout_marginLeft/Right/Top/Bottom,也可以设置layout_margin来同时控制四个偏移量

? padding设置填充,主要设置组件内元素的填充亮,比如TextView中文字的具体位置,paddingLeft/Right/Top/Bottom以及android:padding同时设置四个位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTA8uX2w-1637497191571)(C:\Users\Michilay\AppData\Roaming\Typora\typora-user-images\image-20211118113433036.png)]

二、基本组件

1.文本框与编辑框TextView EditView

EditView是TextView的子类,所以拥有它的所有方法

<?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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试单行文本,这段文本有很多个字"
        android:autoLink="email"
        android:singleLine="true"
        android:textSize="80px"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试多行文本,这段文本有很多个字"
        android:textSize="80px"/>
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="请输入你的密码"
        android:inputType="numberPassword"/>


</LinearLayout>

需要注意的是输入类型和是否单行输入

2.按钮Button

最主要的就是onClick方法,可以同各国两种方式实现,一种是在onCreate中设置setOnClickListener(new View.OnClickListener()来实现,另一种是在xml里写onclick属性,在Activity类中直接写该方法,下面实现了一下登陆验证的操作

xml如下

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:stretchColumns="0,3">

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="注册邮箱:"
            android:textSize="30dp"/>
        <EditText
            android:id="@+id/user"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入你的注册邮箱"
            android:inputType="textEmailAddress"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="密码:"
            android:textSize="30dp"/>
        <EditText
            android:id="@+id/pwd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入你的密码"
            android:inputType="textPassword"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="密码确认:"
            android:textSize="30dp"/>
        <EditText
            android:id="@+id/pwdc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请再次输入你的密码"
            android:inputType="textPassword"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:id="@+id/info"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textColor="#a1a1a1"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <Button
            android:id="@+id/reg"
            android:layout_height="wrap_content"
            android:layout_width="200px"
            android:text="注册"
            android:textSize="25dp"
            android:onClick="regClick"
            />
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <Button
            android:id="@+id/re"
            android:layout_height="wrap_content"
            android:layout_width="200px"
            android:text="重置"
            android:textSize="25dp"
            />
        <TextView/>
    </TableRow>


</TableLayout>

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ButtonActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button);
        EditText user = findViewById(R.id.user);
        EditText pwd = findViewById(R.id.pwd);
        EditText pwdc = findViewById(R.id.pwdc);
        TextView info = findViewById(R.id.info);
        String pwds = pwd.getText().toString();
        String pwdcs = pwdc.getText().toString();
        Button reg = findViewById(R.id.reg);
        Button re = findViewById(R.id.re);
        re.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                info.setText("");
                user.setText("");
                pwd.setText("");
                pwdc.setText("");
            }
        });
        reg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                pwds.equals(pwdcs)==false竟然判断不出来
                if (!pwds.equals(pwdcs)){
                    info.setText("密码不一致");
                }
                else {
                    Toast t = Toast.makeText(ButtonActivity.this, "注册成功", Toast.LENGTH_SHORT);
                    t.show();
                }
            }
        });
    }
}

3.单选按钮RaidoButton

RaidoButton需要在RadioGroup中使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RadioGroup
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/man"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="20dp"/>
        <RadioButton
            android:id="@+id/woman"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textSize="20dp"/>
    </RadioGroup>
    <Button
        android:id="@+id/submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="提交"/>

</LinearLayout>

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class RadioActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.radiobutton);

        RadioGroup group = findViewById(R.id.group);
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RadioButton button = findViewById(checkedId);
                Toast toast = Toast.makeText(RadioActivity.this, button.getText() + "被点击", Toast.LENGTH_SHORT);
                toast.show();
            }
        });
        Button submit = findViewById(R.id.submit);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < group.getChildCount(); i++) {
                    RadioButton childAt = (RadioButton) group.getChildAt(i);
                    if (childAt.isChecked()){
                        Toast toast = Toast.makeText(RadioActivity.this, childAt.getText() + "确定", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                }
            }
        });
    }
}

java中,通过找到组的id,通过组的getChildCount方法,通过循环,对radio的下标进行选定

4.复选框CheckBox

<CheckBox
    android:id="@+id/c1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="1"/>
<CheckBox
    android:id="@+id/c2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="1"/>
<CheckBox
    android:id="@+id/c3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="1"/>
<Button
    android:id="@+id/submit1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:text="提交"/>

因为checkbox的监听因素,需要创建一个单独的监听器对象,传入多个监听器中

private CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            Toast toast = Toast.makeText(RadioActivity.this, "选中了"+buttonView.getText().toString(), Toast.LENGTH_SHORT);
            toast.show();
        }
    }
};
CheckBox c1 = findViewById(R.id.c1);
CheckBox c2 = findViewById(R.id.c2);
CheckBox c3 = findViewById(R.id.c3);
c1.setOnCheckedChangeListener(listener);
c2.setOnCheckedChangeListener(listener);
c3.setOnCheckedChangeListener(listener);

这样可以简化代码

点击获取如下

Button button = findViewById(R.id.submit1);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String answer = "";
        if(c1.isChecked())
            answer += c1.getText().toString() + " ";
        if(c2.isChecked())
            answer += c2.getText().toString() + " ";
        if(c3.isChecked())
            answer += c3.getText().toString() + " ";
        Toast toast = Toast.makeText(RadioActivity.this, "选中"+answer, Toast.LENGTH_SHORT);
        toast.show();
    }
});

5.图像视图ImageView

图象视图有几个重要的属性

android:adjustViewBounds用于设置ImageView是否调整自己的边界来保持所显示图片的宽高比,也就是以图片为主

android:maxHeight/Width需要设置上一个属性为true才能指定最大值

android:scaleType属性有以下显示

? matrix以matrix的方式缩放

? fitXY以ImageView的尺寸为主

? fitStar/fitCenter/fitEnd保持图片纵横比,知道图片能完全显示

? center/centerCrop/centerInside放在正中间/保持纵横比并完全覆盖/保持纵横比并完全显示

tint染色

6.列表选择框spinner

在xml中新建spinner标签

可以指定strings中的内容放入spinner中

<string-array name="spinner">
    <item>学生</item>
    <item>老师</item>
    <item>保安</item>
    <item>食堂阿姨</item>
    <item>领导</item>
</string-array>
<Spinner
    android:entries="@array/spinner"
    android:layout_width="wrap_content"
    android:layout_height="80px"
    android:id="@+id/spinner"/>

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class SpinnerActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spinner);
        Spinner spinner = findViewById(R.id.spinner);
        spinner.getSelectedItem();
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String s = parent.getItemAtPosition(position).toString();
                Toast.makeText(SpinnerActivity.this,s,Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }
}

java通过选择监听器来监听选择的元素

parent.getItemAtPosition(position).toString();

很多情况下不能从strings中获得内容,我们需要把获取到的内容放在java中存储

通过适配器来实现功能,使用方法如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class Spinner2Activity extends Activity {
    String[] strings = new String[]{"学生","老师","领导"};
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = new LinearLayout(Spinner2Activity.this);
        setContentView(linearLayout);
        Spinner spinner = new Spinner(Spinner2Activity.this);
        ArrayAdapter<String> objectArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,strings);
        objectArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(objectArrayAdapter);
        linearLayout.addView(spinner);
    }
}

7.列表视图ListView

最简单的实现方式就是使用ListView标签,接着设置entity属性为@strings里的内容,如下图所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listview"
        android:divider="@color/red"
        android:dividerHeight="10px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:footerDividersEnabled="false"
        android:headerDividersEnabled="false"
        android:entries="@array/listview"/>

</LinearLayout>

divider是分割条,可以使用颜色和图片

dividerHeight分割条的高度

entries之间见过,就是使用strings中的array来指定list

footerDividersEnabled/header是底部和头部的绘制,需要通过java代码控制

但是这样的并不常用,很多情况下需要从其他地方获取ListView,而且这些内容必须在java代码中管理

下面是使用适配器加xml布局文件生成的listview

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ListviewActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
//        布局
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = new LinearLayout(ListviewActivity.this);
        setContentView(linearLayout);
//        listview
        ListView listView = new ListView(ListviewActivity.this);
//        配置分割线
        View line = View.inflate(ListviewActivity.this, R.layout.linearlayout, null);
//        设置头部线
        listView.addHeaderView(line);
//        创建适配器
        ArrayAdapter<CharSequence> ad = ArrayAdapter.createFromResource(this, R.array.listview, android.R.layout.simple_list_item_checked);
        listView.setAdapter(ad);
        listView.addFooterView(line);
//        放进去
        linearLayout.addView(listView);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String s = parent.getItemAtPosition(position).toString();
                Toast.makeText(ListviewActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        });
    }
}

View.inflate(ListviewActivity.this, R.layout.linearlayout, null);表示的是从其他位置获取的内容

我们也可以自定义列表中的内容,这时候就需要继承ListActivity了,代码如下

package com.thundersoft.test;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.Nullable;

public class Listview2Activity extends ListActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] strings = new String[]{"测试1", "测试2", "测试3"};
        ArrayAdapter<String> ad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings);
        this.setListAdapter(ad);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        String s = l.getItemAtPosition(position).toString();
        System.out.println(s);
    }
}

该方法相对简单,直接通过this.setListAdapter(ad);配置适配器即可

另外要着重说明一下适配器之一的SimpleAdapter,它的代码如下

package com.thundersoft.test;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

public class Listview3Activity extends ListActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int[] ints = {R.drawable.code, R.drawable.pic, R.drawable.fav};
        String[] strings = new String[]{"代码专区", "图片预览", "我的喜爱"};
        List<Map<String,Object>> item = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("image",ints[i]);
            map.put("title",strings[i]);
            item.add(map);
        }
        SimpleAdapter ad = new SimpleAdapter(this, item, R.layout.item, new String[]{"title", "image"}, new int[]{R.id.item_title, R.id.item_image});
        this.setListAdapter(ad);

    }
}

SimpleAdapter的源码如下

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
     @LayoutRes int resource, String[] from, @IdRes int[] to)

context表示指定关联该Adapter运行的上下文,这里是this

data指定一个基于Map的列表List,代表每一行

resource表示要放的布局文件,这里的item是一个LinearLayout中包含一个Image和Text的布局

from表示唯一指定表示名字,这里的title和image和map中的k键对应

to表示为放在布局文件上的哪个位置,item_title和item_image是id

这里需要新建一个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="match_parent">
    <ImageView
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:id="@+id/item_image"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/item_title"/>

</LinearLayout>

8.日期时间选取器DatePicker TimePicker

xml如下

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    tools:context=".MainActivity">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <DatePicker
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TimePicker
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</ScrollView>

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.TimePicker;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

import java.util.Calendar;

public class PickerActivity extends Activity {

    int year;
    int month;
    int day;
    int hour;
    int minute;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picker);
        DatePicker datePicker = findViewById(R.id.date);
        TimePicker timePicker = findViewById(R.id.time);
        timePicker.setIs24HourView(true);
        Calendar instance = Calendar.getInstance();
        year = instance.get(Calendar.YEAR);
        month = instance.get(Calendar.MONTH);
        day = instance.get(Calendar.DAY_OF_MONTH);
        hour = instance.get(Calendar.HOUR_OF_DAY);
        minute = instance.get(Calendar.MINUTE);
        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int month, int day) {
                PickerActivity.this.year=year;
                PickerActivity.this.month=month;
                PickerActivity.this.day=day;
                System.out.println(year+month+day+hour+minute);
            }
        });
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                PickerActivity.this.hour = hour;
                PickerActivity.this.month = minute;
                System.out.println(hour+minute);
            }
        });
    }
}

需要注意的是日历对象的使用

9.计时器Chronometer

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <Chronometer
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chro"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始计时"
        android:id="@+id/startbutton"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止计时"
        android:id="@+id/endbutton"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="归零"
        android:id="@+id/for0"/>
</LinearLayout>

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ChronometerActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chronometer);
        Chronometer chronometer = findViewById(R.id.chro);
//        设置起始时间
        chronometer.setBase(SystemClock.elapsedRealtime());
//        设置格式
        chronometer.setFormat("已用时间:%s");
        Button start = findViewById(R.id.startbutton);
        Button end = findViewById(R.id.endbutton);
        Button for0 = findViewById(R.id.for0);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.start();
            }
        });
        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.stop();
            }
        });
        for0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.setBase(SystemClock.elapsedRealtime());
            }
        });

    }
}

1.先设置初始时间

2.再设置格式

3.开始计时器

4.结束计时器

4.设置监听器(可省略)setOnChronometerTickListener

三、实践

1.要求

实现一个登录页面,提供记住密码和用户名功能,登陆后显示列表视图必须包含登录用户名,且点击列表会显示点击那一项

2.代码实现

login.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/ic_launcher_foreground"
    android:gravity="center"
    android:stretchColumns="0,3">

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="用户名:"
            android:textSize="30dp"/>
        <EditText
            android:id="@+id/user"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入你的用户名"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="密码:"
            android:textSize="30dp"/>
        <EditText
            android:id="@+id/pwd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入你的密码"
            android:inputType="textPassword"
            android:textSize="20dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <CheckBox
            android:id="@+id/remember"
            android:text="记住用户名和密码"
            android:textSize="15dp"/>
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <Button
            android:id="@+id/login"
            android:layout_height="wrap_content"
            android:layout_width="200px"
            android:text="登录"
            android:textSize="25dp"
            />
        <TextView/>
    </TableRow>
    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        >
        <TextView/>
        <Button
            android:id="@+id/re"
            android:layout_height="wrap_content"
            android:layout_width="200px"
            android:text="重置"
            android:textSize="25dp"
            />
        <TextView/>
    </TableRow>


</TableLayout>

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="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:id="@+id/item_user"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="      "
        android:textSize="20dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:id="@+id/item_num"/>
</LinearLayout>

LoginActivity.java

package com.thundersoft.session1;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import android.content.SharedPreferences.Editor;

import androidx.annotation.Nullable;

import javax.security.auth.login.LoginException;

public class LoginActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        //先定义
        SharedPreferences sp = null;

        EditText user = findViewById(R.id.user);
        EditText pwd = findViewById(R.id.pwd);
        Button login = findViewById(R.id.login);
        Button re = findViewById(R.id.re);
        CheckBox remember = findViewById(R.id.remember);

        sp = this.getSharedPreferences("userinfo", Context.MODE_PRIVATE);
        if (sp.getBoolean("checkboxBoolean", false))
        {
            user.setText(sp.getString("user", null));
            pwd.setText(sp.getString("pwd", null));
            remember.setChecked(true);
        }
        SharedPreferences finalSp = sp;
        login.setOnClickListener(new View.OnClickListener() {
            //            执行登录
            @Override
            public void onClick(View v) {
                System.out.println(user.getText().toString());
                //        判断是否输入了名字和密码
                if(user.getText().toString().trim().equals("")){
                    Toast.makeText(LoginActivity.this, "请您输入用户名!", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(pwd.getText().toString().trim().equals("")){
                    Toast.makeText(LoginActivity.this, "请您输入密码!", Toast.LENGTH_SHORT).show();
                    return;
                }
//                记住我判断
                Editor editor = finalSp.edit();
                if (remember.isChecked())
                {
                    editor.putString("user", user.getText().toString());
                    editor.putString("pwd", pwd.getText().toString());
                    editor.putBoolean("checkboxBoolean", true);
                }
                else
                {
                    editor.putString("user", null);
                    editor.putString("pwd", null);
                    editor.putBoolean("checkboxBoolean", false);
                }
                editor.commit();
                //Intent跳转
                Intent intent=new Intent(LoginActivity.this,MainActivity.class);
                intent.putExtra("name", user.getText().toString());
                startActivity(intent);
                finish();

            }
        });
    }
}

MainActivity.java

package com.thundersoft.session1;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.session1.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

public class MainActivity extends ListActivity {



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        拿到数据
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

//        数据存放
        int[] num = new int[]{1,2,3,4,5};
        String[] names = new String[]{name,name,name,name,name};
        List<Map<String,Object>> item = new ArrayList<>();
        for (int i = 0; i < names.length; i++) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("num",num[i]);
            map.put("name",names[i]);
            item.add(map);
        }
        SimpleAdapter ad = new SimpleAdapter(
                this,
                item,
                R.layout.item,
                new String[]{"num", "name"},
                new int[]{R.id.item_num, R.id.item_user});
        this.setListAdapter(ad);
    }

    //        点击事件
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        int index = position+1;
//        String s = l.getItemAtPosition(position).toString();
        Toast.makeText(this,"您选择了第"+ index +"项",Toast.LENGTH_SHORT).show();
    }
}

3.实现效果

在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:27:21  更:2021-11-22 12:28:15 
 
开发: 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 5:59:39-

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