Widget

扶醉桌前 提交于 2020-04-06 02:34:12

Android Widget

Android提供了大量的UI控件,使用这些UI控件可以减少工作量,并一定程度上美化网站(以拯救程序员的贫穷审美观)

控件的属性

通常,宽高是必须配置的属性

android:layout_width="xxdp"//宽度
android:layout_height="xxdp"//高度

width和height有两个特殊属性match_parent和warp_content,前者指定控件的大小由父布局决定,后面指定控件大小刚好包含住里面的内容

下面是一些非必须的共有属性

android:id="@+id/your_id"//添加ID
android:text="Text"//文本
android:gravity="start"//内部(文字)的对齐方式
android:visibility="visible"//可见性
android:ellipsize="end"//文本缩略方式
android:paddingxxxx="10dp"//边缘留白

文本对齐的可选值有top bottom start end center 可以用“|”来同时指定多个值,另外,在新标准中,left和right被start和end代替,应该避免使用它们

可见性的可选值有visible(默认),invisible,gone。visible表示控件可见,invisible表示不可见,但是仍然占据着位置,gone表示控件不再占用屏幕空间。在java代码中,通过getVisibility()方法获得当前可见性,通过setVisibility(arg)方法设置可见性,方法的参数是View.GONE等值

控件的使用

以Button为例

通常要使用一个控件,首先要在xml中定义这个控件,配置其的一系列属性

<Button
    android:id="@+id/button"
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:text="Test Button"
    />

然后,在java代码中设置其如何运行

一般来说,声明相应的变量,由于其实例必须在Activity类的各个方法类可以被访问,故要声明为私有全局变量

private Button button;

然后,我们要获取的实例在onCreate中被启动,故我们要在onCreate中获取实例

//onCreate
button = findViewById(R.id.button);

findViewById()方法接收一个参数:ID,返回该ID对应的控件实例

最后在要使用到这个控件的情景中处理逻辑。对Button而言通常就是在onCreate中为Button注册监听器

//onCreate
button.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        //TODO
    }
});

常见的控件

这些控件通常是Google或其他公司编写好的,我们可以通过内置的方法去修改控件的初始属性,这意味着控件不是在xml中被编写好后就一成不变的

TextView

TextView主要用于在界面上显示一段文本信息,需要配置文本内容

<TextView
    android:id="@+id/text_view"
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:textSize="24sp"
    android:textColor="#00ff00"
    />

修改TextView的内容

textView.setText("Another String");

EditText

EditText用于用户输入

<EditText
    android:id="@+id/edit_text"
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:hint="hint"
    android:maxLines="2"
    />

hint为提示性文本,maxLines是控件内部显示文本的最大行数

获取EditText输入的文本

String inputText = editText.getText().toString;

Button

按钮应该是最重要的控件之一

<Button
    android:id="@+id/button"
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:textSize="24sp"
    android:textColor="#00ff00"
    android:textAllCaps="false"
    />

textAllCaps为英文自动大写转换,配置这一项关闭英文大写转换

下面来看看如何使用匿名类注册监听器

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        //TODO
    }
});

也可用实现接口的方式注册监听器,不过不常用

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v){
        switch(v.getId()){
            case R.id.button:
            //TODO
                break;
            default:
                break;
        }
    }
}

对Button来说,也经常在它的监听器中去处理其他的控件的逻辑,比如处理一段输入文本

private EditText editText;
private Button button;
//onCreate
editText = findViewById(R.id.edit_text);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        String inputText = editText.getText.toString();
        //TODO
    }
});

ImageView

ImageView是用于在界面上展示图片的一个控件,图片通常放在以“drawable”开头的目录下,后缀“-xhdpi”指分辨率的高低程度

ImageView需要配置图片路径

<ImageView
    android:id="@+id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/img_1"
    />

修改ImageView的图片

imageView.setImageResource(R.drawable.img_2);

ProgressBar

ProgressBar用于显示一个进度条

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

默认为圆形进度条,可以通过配置style来变成水平进度条

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleHorizontal"
    android:max="100"
    />

这里的max可以自己设定表示进度条的进度最大值

获取进度值

int progress = progressBar.getProgress();

更改进度

progressBar.setProgress(progress);

setProgress()方法接收一个小于max的int型数

当完成时,使进度条消失

progressBar.setVisibility(View.GONE);

AlertDialog

AlertDialog可以在当前界面弹出一个对话框,能够屏蔽掉其他控件。他的使用有点特殊,由于是弹出窗口,所以并不是在xml中定义,而是在java代码中通过AlertDialog.Builder()构造,其只有一个参数,指定Dialog的上下文

AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);

dialog.setTitle("Title");
dialog.setMessage("Message");
dialog.setCancelable(false);

dialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which){
        //TODO
    }
});

dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which){
        //TODO
    }
});

dialog.show();

通过setxxx可以为Dialog设置一系列的属性,一般必须要设置的有Title,Message,接收一个字符串,和Cancelable,接收一个布尔值,为了达成屏蔽下层控件的目的,通常Cancelable都是设置成false的

接下来设置PositiveButton和NegativeButton,其结构和Button的onClickListener相似,不过多一个参数,第一个参数为字符串,是按钮的文本信息。第二个所用的内部类是DialogInterface.onClickListener(),而不是Button所用的View.onClickListener()

最后调用show()方法把Dialog展示出来

ProgressDialog

ProgressDialog用于弹出一个带进度条的对话框,与AlertDialog类似地,同样具有屏蔽其他控件的功能,有效地避免了加载阶段用户的乱操作。ProgressDialog直接使用ProgressDialog()构造,其只有一个参数,指定Dialog的上下文

ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

progressDialog.setTitle("Title");
progressDialog.setMessage("Message");
progressDialog.setCancelable(true);

progressDialog.show();

属性与上类似。需要注意的是,由于ProgressDialog是没有类似于AlertDialog一样的Button的,所以当setCancelable为false时,必须在处理完数据之后,调用progressDialog.dismiss(),来关闭ProgressDialog,否则用户无法关闭这个对话框!

CheckBox

复选框

<CheckBox
    android:id="@+id/check_box"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
	/>

设置是否勾选

checkBox.setChecked(true);//or false

获取勾选状态

Boolean isChecked = checkBox.isChecked();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!