zoukankan      html  css  js  c++  java
  • 第十三章:常用控件下

    1、ListView

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子:

     列表的显示需要三个元素:

    1.ListVeiw 用来展示列表的View。

    2.适配器 用来把数据映射到ListView上的中介。

    3.数据    具体的将被映射的字符串,图片,或者基本组件。

    根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

    其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。

     我们从最简单的ListView开始:

    package com.example.helloandroid;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import android.app.Activity;
    import android.app.ListActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    
    public class AndroidControl2Activity extends Activity  {
        private ListView listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_android_control2);
            
            listView = new ListView(this);
            
            listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
            
            setContentView(listView);
        }
        private List<String> getData(){
    
            List<String> data = new ArrayList<String>();
            data.add("测试数据1");
            data.add("测试数据2");
            data.add("测试数据3");
            data.add("测试数据4");
            return data;
    
        }
    }
    View Code

    上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。运行后的显示效果如下图:

    SimpleAdapter

    simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

    下面的程序是实现一个带有图片的类表。

    首先需要定义好一个用来显示每一个列内容的xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="horizontal" android:layout_width="fill_parent"
    
        android:layout_height="fill_parent">
    
        <LinearLayout android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFFFF"
                android:textSize="22px" />
    
            <TextView android:id="@+id/info"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#FFFFFFFF"
                android:textSize="13px" />
        </LinearLayout>
    
    </LinearLayout>
    View Code

    实现代码:

    package com.example.helloandroid;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.app.ListActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    
    public class AndroidControl2Activity extends ListActivity   {
        @Override
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.activity_android_control2,
                    new String[]{"title","info"},
                    new int[]{R.id.title,R.id.info});
    
            setListAdapter(adapter);
    
        }
    
        private List<Map<String, Object>> getData() {
    
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            
            map.put("title", "G1");
            map.put("info", "google 1");
            list.add(map);
    
            map = new HashMap<String, Object>();
            map.put("title", "G2");
            map.put("info", "google 2");
            list.add(map);
    
            map = new HashMap<String, Object>();
            map.put("title", "G3");
            map.put("info", "google 3");
            list.add(map);
    
            return list;
    
        }
    
    }
    View Code

    使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(xml),HashMap的 title 和 info。布局文件的组件id,title,info。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

     2、Spinner

    通常分5步:

    第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项 
    第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
    第三步:为适配器设置下拉列表下拉时的菜单样式。
    第四步:将适配器添加到下拉列表上
    第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout  
        android:id= "@+id/widget28"  
        android:layout_width= "fill_parent"  
        android:layout_height= "fill_parent"  
        android:orientation= "vertical"  
        xmlns:android= "http://schemas.android.com/apk/res/android" >  
        <TextView  
            android:id= "@+id/TextView_Show"  
            android:layout_width= "fill_parent"  
            android:layout_height= "wrap_content"  
            android:text= "你选择的是"  
            android:textSize= "25sp" >  
        </TextView>  
        <Spinner  
            android:id= "@+id/spinner_City"  
            android:layout_width= "fill_parent"  
            android:layout_height= "wrap_content" >  
        </Spinner> 
    </LinearLayout> 
    View Code

    代码:

    package com.example.helloandroid;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;
    
    public class AndroidControl3Activity extends Activity {
           private List<String> list = new ArrayList<String>(); 
            private Spinner mySpinner; 
            private TextView myTextView; 
            private ArrayAdapter<String> spinneradapter; 
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_android_control3);
            
             //Spinner显示
              //第一步:添加一个下拉列表项的list,这里添加的项就是下拉列表的菜单项 
                list.add("北京");
                list.add("上海");
                list.add("深圳");
                list.add("广州");
                mySpinner = (Spinner)findViewById(R.id.spinner_City); 
                myTextView = (TextView)findViewById(R.id.TextView_Show); 
              //第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。 
                spinneradapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list); 
              //第三步:为适配器设置下拉列表下拉时的菜单样式。 
                spinneradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
              //第四步:将适配器添加到下拉列表上 
                mySpinner.setAdapter(spinneradapter); 
                //第五步:为下拉列表设置各种事件的响应,这个事响应菜单被选中 
                mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
    
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view,
                            int position, long id) {
                        // TODO Auto-generated method stub
                        myTextView.setText("您选择的是:"+ spinneradapter.getItem(position)); 
                        /* 将mySpinner 显示*/ 
                        view.setVisibility(View.VISIBLE); 
                        
                    }
    
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        // TODO Auto-generated method stub
                        
                    }
    
                });
    
        }
    }
    View Code

      3、GridView

    GirdView的一些属性:

    android:numColumns="auto_fit" --------列数设置为自动 android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度 android:stretchMode="columnWidth"------缩放与列宽大小同步 android:verticalSpacing="10dp"----------垂直边距 android:horizontalSpacing="10dp"-------水平边距

    1、准备数据源

    2、新建适配器

    3、加载适配器

    GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的,下面来个实例,

    activity_android_control4.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" 
        android:background="#000"
        >
        
    <GridView 
            android:id="@+id/gview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="auto_fit"    
            android:columnWidth="80dp"
            android:stretchMode="columnWidth"
            ></GridView>
    </LinearLayout>
    View Code

    item.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:gravity="center"
        android:padding="10dp"
        >
        
        
    <ImageView 
        android:src="@drawable/ic_launcher"
        android:id="@+id/image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        
        />
    
    <TextView 
        android:id="@+id/text"
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:text="文字"
        />
    </LinearLayout>
    View Code

    AndroidControl4Activity.java:

    package com.example.helloandroid;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.GridView;
    import android.widget.SimpleAdapter;
    
    public class AndroidControl4Activity extends Activity {
        private GridView gview;
        private List<Map<String, Object>> data_list;
        private SimpleAdapter sim_adapter;
        // 图片封装为一个数组
        private int[] icon = { R.drawable.address_book, R.drawable.calendar,
                R.drawable.camera, R.drawable.clock, R.drawable.games_control,
                R.drawable.messenger, R.drawable.ringtone, R.drawable.settings,
                R.drawable.speech_balloon, R.drawable.weather, R.drawable.world,
                R.drawable.youtube };
        private String[] iconName = { "通讯录", "日历", "照相机", "时钟", "游戏", "短信", "铃声",
                "设置", "语音", "天气", "浏览器", "视频" };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_android_control4);
            
            gview = (GridView) findViewById(R.id.gview);
            //新建List
            data_list = new ArrayList<Map<String, Object>>();
            //获取数据
            getData();
            //新建适配器
            String [] from ={"image","text"};
            int [] to = {R.id.image,R.id.text};
            sim_adapter = new SimpleAdapter(this, data_list, R.layout.item, from, to);
            //配置适配器
            gview.setAdapter(sim_adapter);
    
        }
        public List<Map<String, Object>> getData(){        
            //cion和iconName的长度是相同的,这里任选其一都可以
            for(int i=0;i<icon.length;i++){
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("image", icon[i]);
                map.put("text", iconName[i]);
                data_list.add(map);
            }
                
            return data_list;
        }
    
    }
    View Code

      4、Dialog

    在Android开发中,我们经常会需要在界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,据我所知,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7Android Dialog对话框的使用方法,希望对大家能有所帮助。

     

    图1

    图2

    图3

    图4

    图5

    图6

    图7

    图8

    1、主窗体图1的实现,在Lanyout中添加7个按钮,代码如下所示:

    main.xml
     1 package zqvie.com;
     2 import android.app.Activity;
     3 import android.app.AlertDialog;
     4 import android.app.AlertDialog.Builder;
     5 import android.os.Bundle;
     6 import android.view.View;
     7 import android.view.View.OnClickListener;
     8 import android.widget.Button;
     9 
    10 public class DialogActivity extends Activity implements OnClickListener {
    11     /** Called when the activity is first created. */
    12     @Override
    13     public void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.main);
    16         But_One=(Button) findViewById(R.id.But_One);     //注册按钮But_One
    17         But_Two=(Button) findViewById(R.id.But_Two);   
    18         But_Three=(Button) findViewById(R.id.But_Three);
    19         But_Four=(Button) findViewById(R.id.But_Four);
    20         But_Five=(Button) findViewById(R.id.But_Five);
    21         But_Six=(Button) findViewById(R.id.But_Six);
    22         But_Seven=(Button) findViewById(R.id.But_Seven);
    23         But_One.setOnClickListener(this);                //为按钮But_One注册侦听器
    24     }
    25 Button But_One,But_Two,But_Three,But_Four,But_Five,But_Six,But_Seven;  //定义按钮
    26 }
    DialogActivity.java

    2、图2的实现,设置单击“按钮1”时,弹出对话框,代码如下所示:

    复制代码
     public void onClick(View v) {
            // TODO Auto-generated method stub
            if(v.getId()==R.id.But_One)
            {
                AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity .this);//生成一个对话框对象
                builder.setMessage("确定要退出吗?");   //设置对话框的显示信息
                builder.setTitle("提示");           //设置对话框的标题
                builder.setPositiveButton("确定",null);  //设置第一个按钮的Text,null处也可替换为new OnClickListener() {}
                builder.setNegativeButton("取消",null);   //设置第二个按钮的Text
                builder.create().show();                    //创建并显示对话框
            }
        }
    复制代码

     3、图3的实现,设置单击“按钮2”时,弹出对话框,代码和效果图2如下所示:

    复制代码
    if(v.getId()==R.id.But_Two)
            {
                AlertDialog.Builder builder= new AlertDialog.Builder(DialogActivity.this);//生成一个对话框对象
                builder.setIcon( android.R.drawable.btn_star);//设置对话框的图标
                builder.setTitle("喜好调查");                  //设置对话的标题
                builder.setMessage("你喜欢李连杰的电影吗");   //设置对话框的显示信息
                builder.setPositiveButton("很喜欢",null);
                builder.setNeutralButton("一般",null);
                builder.setNegativeButton("不喜欢",null);
                builder.create().show();
            }
    
    复制代码

     4、图4的实现,设置单击“按钮3”时,弹出对话框,代码和效果图3如下所示:

    复制代码
     1 if(v.getId()==R.id.But_Three)
     2         {
     3             AlertDialog.Builder builder=new AlertDialog.Builder(this);
     4             builder.setTitle("请输入");
     5             builder.setIcon(android.R.drawable.ic_dialog_info);   //设置对话框的图标
     6             builder.setView(new EditText(this));      //设置对话框中显示一个输入框
     7             builder.setPositiveButton("确定",null);
     8             builder.setNegativeButton("取消",null);
     9             builder.show();
    10         }
    复制代码

     5、图5的实现,设置单击“按钮4”时,弹出对话框,代码和效果图4如下所示:

    复制代码
    1 if(v.getId()==R.id.But_Four)
    2         {
    3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
    4             builder.setTitle("单选框");   //设置对话框的标题
    5             builder.setIcon(android.R.drawable.ic_dialog_info);  //设置对话框的图标
    6             builder.setSingleChoiceItems( new String[] { "Item1", "Item2" }, 0,null);  //设置对话框的单选项
    7             builder.setNegativeButton("取消", null);
    8             builder.create().show();
    9         }
    复制代码

     6、图6的实现,设置单击“按钮5”时,弹出对话框,代码和效果图5如下所示:

    复制代码
    1 if(v.getId()==R.id.But_Five)
    2         {
    3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
    4             builder.setTitle("复选框");                  //设置对话框的标题
    5             builder.setMultiChoiceItems( new String[] { "Item1", "Item2" }, null, null); //设置对话框的复选项
    6             builder.setPositiveButton("确定", null); //设置对话框的第一个按钮"确定"
    7             builder.setNegativeButton("取消", null); //设置对话框的第二个按钮"取消"
    8             builder.show();
    9         }
    复制代码

     7、图7的实现,设置单击“按钮6”时,弹出对话框,代码和效果图6如下所示:

    复制代码
    1 if(v.getId()==R.id.But_Six)
    2         {
    3             Builder builder=new AlertDialog.Builder(this);  //生成一个对话框对象
    4             builder.setTitle("列表框");
    5             builder.setItems(new String[]{"Item1","Item2"},null);
    6             builder.setNegativeButton("确定",null);
    7             builder.create().show();
    8         }
    复制代码

     8、图8的实现,设置单击“按钮7”时,弹出自定义对话框,这种对话框相对上面讲的要复杂一些,它需要通过一个.xml文件来传递你要呈现的布局。代码和效果图7如下所示:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_height="wrap_content" android:layout_width="wrap_content"
     4  android:background="#ffffffff" android:orientation="horizontal"
     5  android:id="@+id/mydialog">
     6  <TextView android:layout_height="wrap_content"
     7    android:layout_width="wrap_content"
     8   android:id="@+id/tvname" android:text="姓名:" />
     9  <EditText android:layout_height="wrap_content"
    10   android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>
    11 
    12 </LinearLayout>
    dialog.xml
     1 if(v.getId()==R.id.But_Seven)
     2         {
     3             LayoutInflater inflater = getLayoutInflater();
     4                View layout = inflater.inflate(R.layout.mydialog,
     5                  null);
     6              
     7                new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
     8                  .setPositiveButton("确定", null)
     9                  .setNegativeButton("取消", null).show();
    10         }
    DialogActivity.java

    感悟

         学习了制作对话框,才发现其实对话框的制作也是非常简单的,一般情况下只需设置对话框的标题、信息、图标、按钮即可,有的时候还需要添加文本框、单选按钮、复选框、列表项。然而比较复杂的情况就是自定义对话框。在设置自定义对话框的时候,需要设计一个你的xml文件,里面是你的自定义布局,然后通过,主窗体调用xml来实现自定义对话框的制作。

      5、ProgressDialog

    先看效果:

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical" android:layout_width="fill_parent"  
        android:layout_height="fill_parent">  
        
        <Button android:text="圆形进度条" android:id="@+id/Button01"  
            android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
        <Button android:text="长型进度条" android:id="@+id/Button02"  
            android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
      
    </LinearLayout>  
    View Code

    代码:

    package com.example.helloandroid;
    
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class ProgressDialogActivity extends Activity {
    
        private ProgressDialog mpDialog;  
        private Button btn1,btn2;  
        private int mCount = 0;  
    
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_progress_dialog);
            
             //得到按钮对象 
            btn1 = (Button)findViewById(R.id.Button01); 
            btn2 = (Button)findViewById(R.id.Button02); 
            btn1.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    mpDialog = new ProgressDialog(ProgressDialogActivity.this);  
                    mpDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置风格为圆形进度条  
                    mpDialog.setTitle("提示");//设置标题  
                    mpDialog.setIcon(R.drawable.clock);//设置图标  
                    mpDialog.setMessage("这是一个圆形进度条");  
                    mpDialog.setIndeterminate(false);//设置进度条是否为不明确  
                    mpDialog.setCancelable(true);//设置进度条是否可以按退回键取消  
                    mpDialog.setButton("确定", new DialogInterface.OnClickListener(){  
                            @Override  
                             public void onClick(DialogInterface dialog, int which) {  
                                    dialog.cancel();  
                                              
                                    }  
                                          
                              });  
                    mpDialog.show();  
                }
                
            });
    
    
            //设置mButton02的事件监听 
    
            btn2.setOnClickListener(new Button.OnClickListener() { 
                         @Override 
                         public void onClick(View v) 
                         { 
                             // TODO Auto-generated method stub 
                             mCount = 0; 
                             // 创建ProgressDialog对象 
                             mpDialog = new ProgressDialog(ProgressDialogActivity.this); 
                             // 设置进度条风格,风格为长形 
                             mpDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
                             // 设置ProgressDialog 标题 
                             mpDialog.setTitle("提示"); 
                             // 设置ProgressDialog 提示信息 
                             mpDialog.setMessage("这是一个长形对话框进度条"); 
                             // 设置ProgressDialog 标题图标 
                             mpDialog.setIcon(R.drawable.camera); 
                             // 设置ProgressDialog 进度条进度 
                             mpDialog.setProgress(100); 
    
                             // 设置ProgressDialog 的进度条是否不明确 
    
                             mpDialog.setIndeterminate(false); 
    
                             // 设置ProgressDialog 是否可以按退回按键取消 
    
                             mpDialog.setCancelable(true); 
    
                             // 让ProgressDialog显示 
    
                             mpDialog.show(); 
    
                             new Thread() 
    
                             { 
                                 public void run() 
                                 { 
                                     try 
                                     { 
                                         while (mCount <= 100) 
                                         { 
                                             // 由线程来控制进度。 
                                             mpDialog.setProgress(mCount++); 
                                             Thread.sleep(100); 
                                         } 
                                         mpDialog.cancel(); 
                                     } 
                                     catch (InterruptedException e) 
                                     { 
                                         mpDialog.cancel(); 
                                     } 
    
                                 } 
    
                             }.start(); 
    
                         } 
    
                     }); 
    
            
        }
    }
    View Code

    6、Menu

     Android的菜单有三种:
    Options Menu
      当用户按下menu button按钮时显示的菜单
    Context Menu
      当用户长久按住屏幕,即被注册显示上下文菜单的视图时显示的菜单
    Submenu
      当用户按下一个菜单的某个选项时弹出的子菜单

    Options Menu创建选项菜单的步骤:

    1、覆盖Activity 的onCreateOptionMenu(Menu menu)方法,当菜单第一次被打开时调用

    2、调用Menu 的add( )方法添加菜单项(MenuItem),同时可以调用MenuItem 的setIcon( )方法来为菜单项设置图标

    3、当菜单项(MenuItem)被选择时,覆盖Activity 的onOptionsItemSelected(MenuItem item)来响应事件

    Context Menu顾名思义,与上下文(环境)有关。思想类似于Windows中的右键单击弹出的快捷菜单。操作时需要长时间按住某个东东不放。

    创建上下文菜单的步骤:

    1、覆盖Activity 的onCreateContextMenu(Menu menu)方法,调用Menu的add()方法添加菜单项(MenuItem)。

    2、覆盖Activity 的onContextItemSelected(MenuItem iitem)来响应事件。

    3、调用registerForContextMenu( )方法来为视图注册上下文菜单。

    布局文件:

    <RelativeLayout 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"
        tools:context="${relativePackage}.${activityClass}" >
    
    <Button
            android:id="@+id/ContextButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="按我弹出Context Menu" />
    
    </RelativeLayout>
    View Code

    代码:

    package com.example.helloandroid;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.SubMenu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MenuActivity extends Activity {
    
        private Button btnContext;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
            
            btnContext = (Button) findViewById(R.id.ContextButton);
            registerForContextMenu(btnContext);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            //当用户按下menu button按钮时显示的菜单 
            menu.add(0, 1, 1, "香蕉");
            menu.add(0, 2, 2, "苹果");
            //当用户按下一个菜单的某个选项时弹出的子菜单
            SubMenu subMenu = menu.addSubMenu(1, 100, 100, "桃子");
            subMenu.add(2, 101, 101, "大桃子");
            subMenu.add(2, 102, 102, "小桃子");
    
            return super.onCreateOptionsMenu(menu);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            if(item.getItemId() == 1){
                Toast t = Toast.makeText(this, "你选的是苹果", Toast.LENGTH_LONG);
                t.show();
            }
            else if(item.getItemId() == 2){
                Toast t = Toast.makeText(this, "你选的是香蕉", Toast.LENGTH_SHORT);
                t.show();
            } 
            return true;
    
        }
        //Context Menu
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            // TODO Auto-generated method stub
            if(v==btnContext){
                menu.setHeaderTitle("这是1");
                menu.add(200, 200, 200, "Context Menu 1");
                menu.add(200, 201, 201, "Context Menu 2");
            }
            super.onCreateContextMenu(menu, v, menuInfo);
        }
        
        
    }
    View Code


    效果图:

    7、AutoCompleteTextView

     自动完成文本框,它实际上也是一个文本编辑框,可以理解为对EditText功能的扩展,它对输入的内容可以进行提示并且自动完成。本文会讲解常用属性设置,以及如何向AutoCompleteTextView增加提示数据.

    说明

      自动完成文本框(AutoCompleteTextView),可以从官方文档上看出,是从EditText继承而来,所以它实际上也是一个文本编辑框,只是多了一个自动提示输入补全的功能。功能类似于:当用户输入一定字符之后,自动完成文本框会显示一个下拉列表,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView会按照的选择自动填写该文本框。

    常用属性

      因为是继承自EditText,所以AutoCompleteTextView除了可以使提供用Edit的属性和方法之外,还支持如下一些特殊的属性及方法,这里只介绍一些常用的,具体请参见官方文档:

    • android:completionHint/setCompletionHint(CharSequence):设置出现下拉列表的提示标题。
    • android:completionTjreshold/setThreshold(int):设置至少输入几个字符才会显示提示。
    • android:dropDownHeight/setDropHeight(int):设置下拉列表的高度。
    • android:dropDownWidth/setDropWidth(int):设置下拉列表的宽度。
    • android:popupBackground/setDropDownbackgroundResource(int):设置下拉列表的背景。

    填充选择数据

      在Android程序中,为了展示数据,通常会用到一个Adapter的接口。没错,这是一个接口,是连接后端数据和前端显示的桥梁,是data souce和UI(View)之间一个重要的纽带。下图展示了Adapter在Android程序中的关系:

    对于Adapter,它是一个接口,Android为其声明了各种实现类,对于在AutoCompleteTextView控件中,一般使用ArrayAdapter<T>即可完成功能,对于一些其他实现类的应用场景,以后会慢慢介绍。

      ArrayAdapter<T>继承自一个抽象类BaseAdapter,而这个抽象类实现了Adapter接口,所以继承关系应该是:Adapter→BaseAdater→ArrayAdapter<T>。

      从名字上可以看出,ArrayAdapter<T>是以一个数组的形式去存储数据的,它也确实是这么做的,并且可以传递一个数组对其进行构造。所以我们只需要填充一个数组对象,就完成ArrayAdapter对象的初始化工作,在把得到的ArrayAdapter对象传递给AutoCompleteTextView控件,即可对其进行选择数据设置。

    布局文件:

    <RelativeLayout 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"
        tools:context="${relativePackage}.${activityClass}" >
    
        <AutoCompleteTextView
             android:id="@+id/autotext"
             android:completionHint="Famous Citi"
             android:completionThreshold="1"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />
    
    
    </RelativeLayout>
    View Code

    代码:

    package com.example.helloandroid;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.AutoCompleteTextView;
    
    public class AutoCompleteTextViewActivity extends Activity {
        private AutoCompleteTextView autotext;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_auto_complete_text_view);
            
            autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
            //设置数据源
            String[] autoStrings=new String[]{"New York","Tokyo","beijing","london","Seoul Special","Los Angeles"};
            //设置ArrayAdapter,并且设定以单行下拉列表风格展示(第二个参数设定)。
            ArrayAdapter<String> adapter=new ArrayAdapter<String>(AutoCompleteTextViewActivity.this, 
             android.R.layout.simple_dropdown_item_1line, autoStrings);
            
            autotext.setAdapter(adapter);
    
    
    
        }
    }
    View Code

    8、SeekBar

    拖动条(SeekBar)和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块的位置来标识数值----而且拖动条允许用户拖动滑动块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如音量调节。

    SeekBar允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性来指定

    android:thumb  指定一个Drawable对象,该对象将作为自定义滑块。

    为了让程序能响应拖动条滑块位置的改变,程序可以考虑为他绑定一个OnSeekBarChangerListener监听器。

    通过一个实例:通过滑动块来改变图片的透明度,来看看SeekBar。

    布局XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <ImageView 
        android:id="@+id/image"
        android:layout_width="fill_parent" 
        android:layout_height="240px" 
        android:src="@drawable/world"
        />
    <SeekBar 
        android:id="@+id/seekbar"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:max="255"
        android:progress="255"
        android:thumb="@drawable/ic_launcher"
        />
    </LinearLayout>
    View Code

    代码:

    package com.example.helloandroid;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ImageView;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    
    public class SeekBarActivity extends Activity {
        private ImageView  image;
        private SeekBar seekBar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_seek_bar);
            
            image = (ImageView)this.findViewById(R.id.image);
            seekBar = (SeekBar)this.findViewById(R.id.seekbar);
            
            seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
                
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
                
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
                
                //当拖动条的滑块位置发生改变时触发该方法
                @Override
                public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                    image.setAlpha(arg1);
                }
            });
        }
    }
    View Code

    效果如下:

  • 相关阅读:
    js之iframe子页面与父页面通信
    js的event对象
    整洁代码的4个条件
    PYTHON 自然语言处理
    如何检测浏览器是否支持CSS3
    BootStrap前端框架使用方法详解
    如何使用repr调试python程序
    Python编程快速上手——Excel到CSV的转换程序案例分析
    C++和JAVA传统中积极的一面
    20个LINUX相关的网站
  • 原文地址:https://www.cnblogs.com/engine1984/p/4184626.html
Copyright © 2011-2022 走看看