《第一行代码》阅读笔记(六)——AndroidUI控件(初级)

《第一行代码》阅读笔记(六)——AndroidUI控件(初级),第1张

概述这一部分书中讲的十分简洁,估计是因为作者考虑到大家刚刚接触到Android,所以没有展开。而控件的使用其实也是非常简单的事情,只要有Java的基础,再了解一些控件的属性,就可以得心应手了。所以笔者在这里补充一些控件的使用,也十分简单。如果暂时不能理解,也不要担心,先往下看,等到明白的时候

这一部分书中讲的十分简洁,估计是因为作者考虑到大家刚刚接触到AndroID,所以没有展开。而控件的使用其实也是非常简单的事情,只要有Java的基础,再了解一些控件的属性,就可以得心应手了。所以笔者在这里补充一些控件的使用,也十分简单。如果暂时不能理解,也不要担心,先往下看,等到明白的时候在回过头来,就会发现真的特别简单。

TextVIEw

属性

        androID:ID="@+ID/txv1"

当前控件唯一标识符,以后的交互中会经常使用,相当于这个控件的name

        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"

控件的宽度和高度,每个控件都有,除了可以指定数据还可以使用match_ parent、 fill_ parent和wrap_ content。现在fill_ parent已经不用了。关于match_ parent和wrap_ content书中是这样讲的,我觉得还是挺简单明了的。

——第一行代码
然后使用androID:layout_ wIDth 和androID: layout_ height 指定了控件的宽度和高度。AndroID 中所有的控件都具有这两个属性,可选值有3种: match_ parent、 fill_ parent和wrap_ content。 其中match_ parent 和fill_ parent 的意义相同,现在官方更加推荐使用match_ parent。 match_ parent 表示让当前控件的大小和父布局的大小-样,也就是由父布局来决定当前控件的大小。wrap_ content 表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。所以上面的代码就表示让TextVIEw的宽度和父布局一样宽,也就是手机屏幕的宽度,让TextVIEw的高度足够包含住里面的内容就行。当然除了使用上述值,你也可以对控件的宽和高指定一个固定的大小,但是这样做有时会在不同手机屏幕的适配方面出现问题。

总结起来就是一句话,match_ parent是填充父布局,wrap_ content是自己有多少占多少。

   androID:gravity="center"

指定控件中内容的位置,书中是这样介绍的

——第一行代码
我们使用androID:gravity来指定文字的对齐方式,可选值有top、bottom. left、right、center等,可以用来同时指定多个值,这里我们指定的center, 效果等同于center_vertical|center_ horizontal, 表示文字在垂直和水平方向都居中对齐。

    androID:text="This is a text"    androID:textcolor="#00ff00"    androID:textSize="60sp" />

这三个简单明了,分别是文字,文字颜色和文字大小。
这里附上一个文字颜色表,仅供参考

button

button按钮的属性基本上和TextVIEw相似,值得注意的是

可以使用androID:textAllCaps="false"来禁止button中的文字转化成为大写可以在Activity里面为按钮绑定监听器事件
button btnID = (button) findVIEwByID(R.ID.btn_ID);        btnID.setonClickListener(new VIEw.OnClickListener() {            @OverrIDe            public voID onClick(VIEw v) {               //此处添加逻辑            }        });
EditText

EditText是一个对话框,用处十分广泛,像QQ、短信等等,而控件属性大同小异,而文中提到比较特殊的就是

androID:hint=“xxx” 类似于提示,在登录界面时,每个对话框会提示需要输入的是账号或者密码,当输入文字时消失。androID:maxlines=“2”。因为之前设置的宽度是可变的,随着输入内容的不断增加会变得不好看,设置了这个最大行数,就可以在超过两行时自动向下拉取进度条,而不调整控件大小。ImageVIEw

展示图片的控件,通过androID:src来指定图片的位置,图片一般存放在drawable中,可以存放不同分辨率的图片,这样在不同设备上都可以显示。

Progressbar

是界面上显示的一个进度条

为了实现进度条的功能,需要调整控件的可见性。

——第一行代码
AndroID控件的可见属性。所有的AndroID控件都具有这个属性,可以通过androID:visibility进行指定,可选值有3种: visible、 invisible 和gone。visible 表示控件是可见的,这个值是默认值,不指定androID:visibility时,控件都是可见的。invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。gone 则表示控件不仅不可见,而且不再占用任何屏幕空间。我们还可以通过代码来设置控件的可见性,使用的是setVisibility()方法,可以传人VIEw. VISIBLE、VIEw. INVISIBLE和VIEw. GONE这3种值。

其中有一个属性可以设置进度条的格式,就是Style。

<Progressbar            androID:ID="@+ID/pb_normal"            androID:layout_wIDth="match_parent"            androID:layout_height="wrap_content" />        <Progressbar            androID:ID="@+ID/pb_small"                        androID:layout_wIDth="match_parent"            androID:layout_height="wrap_content" />        <Progressbar            androID:ID="@+ID/pb_large"                        androID:layout_wIDth="match_parent"            androID:layout_height="wrap_content" />        <Progressbar            androID:ID="@+ID/pb_horizontal"                        androID:layout_wIDth="match_parent"            androID:layout_height="wrap_content" />        <Progressbar            androID:ID="@+ID/pb_horizontal_default"                        androID:max="100"            androID:progress="50"            androID:layout_wIDth="match_parent"            androID:layout_height="wrap_content" />

对应

很简单对不对。其中还可以通过androID:max="100",androID:progress="50" 来实现进度条的模拟。

但是这不是一个静止的画面,需要让他动起来。怎么做呢?主要的思路就是,先开一个子线程,在线程中加载耗时 *** 作,并发送信息。然后,通过Handler机制接受信息,更新进度条,完成后隐藏进度条。

第一步:声明变量

private Progressbar progressbar;    private int mProgress = 0;    private Handler mHandler;

这个不多说,mProgress用来记录进度,默认是零。然后还有一些绑定布局啥的就不说了。

第二步:开辟一个线程

new Thread(new Runnable() {            @OverrIDe            public voID run() {                           }                  }).start();

这个不解释了吧,实例一个Thread,以匿名内部类的方式传入Runable类,并且重写run方法,然后start()运行run中的内容。

第三步:写一个耗时方法

  private int doWork() {                mProgress += Math.random() * 10;                try {                    Thread.sleep(200);                } catch (InterruptedException e) {                    e.printstacktrace();                }                return mProgress;            }

Math.random()就是生成0到1之间的随机小数,这里+=包括一个强转。之后每次睡2s。

第四步:

while (true) {                    mProgress = doWork();                    Message m = new Message();                    if (mProgress < 100) {                        m.what = 0x111;                        mHandler.sendMessage(m);                    } else {                        m.what = 0x110;                        mHandler.sendMessage(m);                        break;                    }                }

首先就是把doWork()的进度传给mProgress,全局变量一般带个m。然后实例一个Message用来传递信息,如果mProgress小于100,m.what为一个值。大于100说明任务完成,传另外一个值,然后别忘记break。

第五步:实例Handler

mHandler = new Handler() {            @OverrIDe            public voID handleMessage(@NonNull Message msg) {                if (msg.what == 0x111) {                    progressbar.setProgress(mProgress);                                 } else {                    Toast.makeText(MainActivity.this, "耗时 *** 作已完成", Toast.LENGTH_SHORT).show();                    progressbar.setVisibility(VIEw.GONE);                }            }        };

实例一个Handler,然后重写handleMessage方法。传入的msg就是之前发送的msg,然后判断一下,更改progress的值,或者完成,隐藏控件。

好了,运行测试,就可以体验动态进度条了。下面附上一个完整的文件,结构更清晰。

public class MainActivity extends AppCompatActivity {    private Progressbar progressbar;    private int mProgress = 0;    private Handler mHandler;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        progressbar = findVIEwByID(R.ID.p);        mHandler = new Handler() {            @OverrIDe            public voID handleMessage(@NonNull Message msg) {                if (msg.what == 0x111) {                    progressbar.setProgress(mProgress);                                 } else {                    Toast.makeText(MainActivity.this, "耗时 *** 作已完成", Toast.LENGTH_SHORT).show();                    progressbar.setVisibility(VIEw.GONE);                }            }        };        new Thread(new Runnable() {            @OverrIDe            public voID run() {                while (true) {                    mProgress = doWork();                    Log.i("TAG", "handleMessage: " + mProgress);                    Message m = new Message();                    if (mProgress < 100) {                        m.what = 0x111;                        mHandler.sendMessage(m);                    } else {                        m.what = 0x110;                        mHandler.sendMessage(m);                        break;                    }                }            }            private int doWork() {                mProgress += Math.random() * 10;                try {                    Thread.sleep(200);                } catch (InterruptedException e) {                    e.printstacktrace();                }                return mProgress;            }        }).start();    }}

还有一种Handler传递方式,我觉得更加符合咱们思维。是通过sendEmptyMessage直接传递Message.what,省去了实例化Message的步骤。而接收的时候使用Switch判断。附上实例

public class MainActivity extends AppCompatActivity {    ……    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {          ……        mHandler = new Handler() {            @OverrIDe            public voID handleMessage(@NonNull Message msg) {                switch (msg.what) {                    case 100:                        progressbar.setProgress(mProgress);                        break;                    case 200:                        Toast.makeText(MainActivity.this, "耗时 *** 作已完成", Toast.LENGTH_SHORT).show();                        progressbar.setVisibility(VIEw.GONE);                        break;                    default:                        break;                }            }        };        new Thread(new Runnable() {            @OverrIDe            public voID run() {                while (true) {                    mProgress = doWork();                    if (mProgress < 100) {                        mHandler.sendEmptyMessage(100);                    } else {                        m.what = 0x110;                        mHandler.sendEmptyMessage(200);                        break;                    }                }            }            private int doWork() {                 ……            }        }).start();    }}
AlertDialog

AlertDialog是一个对话框,在所有控件之上,可以屏蔽其他控件的交互能力。也非常简单。

先展示几个效果

普通提示对话框

//双选对话框                AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();                alertDialog.setIcon(R.mipmap.ic_launcher);                alertDialog.setTitle("乔布斯");                alertDialog.setMessage("活着就是为了改变世界,难道还有还有其他原因吗?");                alertDialog.setbutton(DialogInterface.button_POSITIVE, "是", new DialogInterface.OnClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which) {                        Toast.makeText(MainActivity.this, "您单击了是按钮", Toast.LENGTH_SHORT).show();                    }                });                alertDialog.setbutton(DialogInterface.button_NEGATIVE, "否", new DialogInterface.OnClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which) {                        Toast.makeText(MainActivity.this, "您单击了否按钮", Toast.LENGTH_SHORT).show();                    }                });                alertDialog.show();

具体介绍一下用到的方法吧:

setTitle:设置对话框的标题,比如“提示”、“警告”等;setMessage:设置对话框要传达的具体信息;setIcon: 设置对话框的图标;setCancelable: 点击对话框以外的区域是否让对话框消失,默认为true;setonShowListener:对话框显示时触发的事件;setonCancelListener:对话框消失时触发的事件。setbutton:传递了三个参数,第一个就是按钮的类型,button_NEUTRAL、button_NEGATIVE和button_POSITIVE,分别对应的就是图中的对的选择和错的选项。还有个中立选项,位置在d出的对话框的最左边。第二个参数就是按钮上面显示的文字。第三个参数就是点击事件。列表提示对话框

 //带四个列表项的对话框                final String[] items = new String[]{"123", "1233", "456", "789"};                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);                builder.setIcon(R.mipmap.ic_launcher);                builder.setTitle("请选择你喜欢的标题");                builder.setItems(items, new DialogInterface.OnClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which) {                        Toast.makeText(MainActivity.this, "您选择了【" + items[which]                                + "】", Toast.LENGTH_SHORT).show();                    }                });                builder.create().show();

和普通对话框不一样的地方就是setItems,传入的第一个参数就是需要显示的内容,是一个字符串数组。第二个参数就是点击事件。

这里还有个不一样的地方,就是普通对话是直接 *** 作的AlertDialog对象,而这里是 *** 作了一个AlertDialog内部类Builder对象。两者之间的关系就是Builder对象的create方法可以生成一个AlertDialog对象。

单选对话框

 final String[] items = new String[]{"1", "2", "3", "4", "5"};                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);                builder.setIcon(R.mipmap.ic_launcher);                builder.setTitle("请选择你喜欢的标题");                builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which) {                        Toast.makeText(MainActivity.this, "您选择了【" + items[which]                                + "】", Toast.LENGTH_SHORT).show();                    }                });                builder.setPositivebutton("确定", null);                builder.create().show();

只是把setItems改成setSingleChoiceItems,同时多了一个参数,就是第二个0,这是默认选择的选择。这里使用

setPositivebutton:设置正面按钮,表示“积极”、“确认”的意思,第一个参数为按钮上显示的文字,下同;setNegativebutton:设置反面按钮,表示“消极”、“否认”、“取消”的意思;setNeutralbutton:设置中立按钮;

实现了AlertDialog.setbutton的方法。

多选对话框

final boolean[] checkedItem = new boolean[]{false,true,false,true,false};                final String[] items = new String[]{"1", "2", "3", "4", "5"};                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);                builder.setIcon(R.mipmap.ic_launcher);                builder.setTitle("请选择你喜欢的标题");                builder.setMultiChoiceItems(items, checkedItem, new DialogInterface.OnMultiChoiceClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which, boolean isChecked) {                        checkedItem[which] = isChecked;                    }                });                builder.setPositivebutton("确定", new DialogInterface.OnClickListener() {                    @OverrIDe                    public voID onClick(DialogInterface dialog, int which) {                        String result = "";                        for (int i = 0; i < checkedItem.length; i++) {                            if (checkedItem[i]) {                                result+=items[i]+"";                            }                        }                        if (!"".equals(result)) {                            Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();                        }                    }                });                builder.create().show();

之前有Single,自然就有Multi,所以设置函数是setMultiChoiceItems。参数分别是显示文字数组,默认选项数组(boolean数组)和点击事件。

ProgressDialog

ProgressDialog和AlertDialog非常相似,只不过多了一个进度条,感觉更像是安装或者下载时候的提示。用法等于AlertDialog+Progressbar相似。

——第一行代码
注意,如果在setCancelable()中传人了false, 表示ProgressDialog是不能通过Back键取消掉的,这时你就一定要在代码中做好控制,当数据加载完成后必须要调用ProgressDialog 的dismiss ()方法来关闭对话框,否则ProgressDialog将会一直存在。

总结

以上是内存溢出为你收集整理的《第一行代码》阅读笔记(六)——AndroidUI控件(初级)全部内容,希望文章能够帮你解决《第一行代码》阅读笔记(六)——AndroidUI控件(初级)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1059433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存