第三章——UI开发的点点滴滴

3.2常用控件的使用方法  

 所有Android控件都可以使用的控制显隐属性:【visibility】有三个值:【visible】【invisible】【gone】;代码设置方式:【SetVisibility】,参数:【View.VISIBLE】【View.INVISIBLE】【View.GONE】

  TextView  用于显示文本。有【id】【layout_width】[layout_height][gravity][]textSize][textColor][text]等属性。

  Button   按钮。比textView多一个【textAllCaps】属性,默认为true,即所有英文字母都会转成大写字母,如果你不想就设为false。监听分为匿名函数和实现接口两种,写法有区别,大同小异。

  EditText  编辑文本。有【hint】属性(提示文言)、【maxLines】属性,设置最大行数;可以通过【getText】方法获取输入内容(之后可以用【toString()】方法转为字符串);

  ImageView  【src】设置图片、也可以在代码中通过【setImageResource()】方法设置图片。

  ProgressBar  用于在用户界面显示一个进度条,【style】属性可以设置改变进度条样式(转圈的、进度的等)。【android:max】可以设置进入条最大值。比如:

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

      这样在代码中就能动态设置进度条进度了:

        public void onClick(View v) {
           switch(v.getId()){
               case R.id.button_1:
                   int iProgess = progressBar.getProgress();
                   iProgess += 10;
                   progressBar.setProgress(iProgess);
                   break;
               default:
                   break;
           }

  AlertDialog  提示对话框,对话框层位于元素图层的最上方,能屏蔽掉下面图层的交互能力。使用方法如下(点击按钮弹出一个dialog):

        public void onClick(View v) {
           switch(v.getId()){
               case R.id.button_1:
                   AlertDialog.Builder dialog = new AlertDialog.Builder(SecondActivity.this);
                   dialog.setTitle("this is a dialog");//设置标题
                   dialog.setMessage("Something important");//设置提示内容
                   dialog.setCancelable(false);//是否能使用bach按钮关闭
                   dialog.setPositiveButton("OK",new DialogInterface.OnClickListener(){
                        public void OnClick(DialogInterface dialog, int iwhich){}
                   });//确定按钮的点击事件
                   dialog.setNegativeButton("Cancle",new DialogInterface.OnClickListener(){
                       public void OnClick(DialogInterface dialog, int iwhich){}
                   });//取消按钮的点击事件
                    dialog.show();
                   break;
               default:
                   break;
           }

  ProgressDialog  多一个进度条,一般用于提示用户当前操作比较耗时,让用户耐心等待。用法和【AlertDialog】差不多。对话框的消掉方法【dismiss()】。

3.3详解四种布局

  Linear Layout  线性布局

  RelativeLayout  相对布局

  FrameLayout  帧布局(就是绝对布局,所有元素默认左上角,需要挨个按像素设置位置,所以叫【帧】?)

  PercentRelativeLayout和PrecentFrameLayout  百分比布局  新加的两种布局方式,在【RelativeLayout】和【FrameLayout】上做的扩展,使他们能支持百分比布局。

 3.4系统控件不够用?创建自定义控件

  控件和布局的继承关系:

  

 

   可以看到,所有控件都继承自View,所有布局都继承自【VieeGroup】,【View】是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域上的各种事件。

3.4.1引入布局

  就是新建一个使用频率很高的布局,然后在其他布局中直接引用该布局,而不是重复写该布局;具体实现过程就是

  1.新建一个布局文件,里面是通用布局,比如【title.xml】

  2.在其他布局中使用【<inuclude layout = "@layout/title'>】即可引用该布局。如果你引用的是一个标题栏的布局,可能还需要先隐藏掉系统自带的默认标题栏布局。隐藏方法如下:

ActionBart actionbar = getSupportActionBar();
if(action != null){
action.hide();
}

3.4.2创建自定义布局

  就是为共通的布局写一个通用的响应事件,避免多个活动中重写同样的事件响应处理。具体操作如下:

pubilc class TitleLayout extends LinearLayout{
    public TitleLayout(Context context, AttributeSet attrs){
        super(context,attrs);
        LayoutInflater.from(context).inflate(R.id.title,this);    
    }    
    
}

这样使用这个布局和使用上面的【<inuclude layout = "@layout/title'>】是一个效果,但是可以在代码中添加响应事件。xml中修改如下(效果和上面的【<inuclude layout = "@layout/title'>】一样):

<com.example.uicustomvies.TitleLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
/>

如果需要相应什么事件,就可以直接在上面的类中添加了,比如其中一个button的点击相应处理:

pubilc class TitleLayout extends LinearLayout{
    public TitleLayout(Context context, AttributeSet attrs){
        super(context,attrs);
        LayoutInflater.from(context).inflate(R.id.title,this); 
        Button titleBack = (Button)FindViewById(R.id.title_back);
        titleBack.setOnClickListenner(new OnClickListenner(){
        ...
        });      
    }    
    
}

这样布局和处理代码都实现了复用,省去了很多编写重复代码的工作量。

3.5最常用也是最难用的控件——ListView

  布局xml:

    <ListView
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

  代码部分:

    private String[] data = {"Apple","Banana","Orange"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(FirstActivity.this, android.R.layout.simple_expandable_list_item_1,data);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);

这里的【android.R.layout.simple_expandable_list_item_1】是一个Android内置的布局文件的id,里面只有一个TextView。

你也可以写一个ArrayAdapter的子类,用以加载单挑list布局,形式略。

  提升ListView的运行效率:因为你写的Adapter子类的【getView()】方法每次都将布局重新加载一遍,当list快速滚动时,这就成为了性能瓶颈;你可以使用【GetView()】方法的第二个参数【View convertView】来缓存之前加载完的布局;具体方法略了。

  点击事件:【onItemClick()】这是点击list的回调。代码略。

3.6更强大的滚动控件——RecyclerView

  Lits性能差,不能横向滚动,过时的玩意,用【RecyclerView】吧,ListViewPlus。

  使用方法书上写的很简洁,无需复写,略了。就是写一个【Adapter】写一个单条list布局,代码中一加载数据。over。

posted @ 2020-12-04 01:05  吉尔加斯  阅读(78)  评论(0)    收藏  举报