0%

TimePicker是android系统里的时间控件,我们可以通过这个控件让用户输入合法的时间,很方便。 下面是效果图: 具体代码: 布局main.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"
    >
<TextView  android:id="@+id/tv"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text=""
    />
<TimePicker android:id="@+id/tp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
/>
<Button android:id="@+id/b1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="显示在标题栏"
/>
</LinearLayout>

程序代码:

package com.pocketdigi;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;

public class main extends Activity {
    /** Called when the activity is first created. */
    TextView tv;
    TimePicker tp;
    Button b1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TPDemo();
    }
    public void TPDemo(){
        tp=(TimePicker)findViewById(R.id.tp);
        tp.setIs24HourView(true);//是否显示24小时制?默认false
        tp.setCurrentHour(6);
        tp.setCurrentMinute(20);
        //设置显示时间为6:20
        tp.setOnTimeChangedListener(tpLis);
        //时间改变时触发
        tv=(TextView)findViewById(R.id.tv);
        b1=(Button)findViewById(R.id.b1);
        b1.setOnClickListener(b1Lis);   	
    }
    private OnTimeChangedListener tpLis=new OnTimeChangedListener() {   
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {   
            tv.setText("[" + hourOfDay + ":" + minute + "]" + "["  
                    + view.getCurrentHour() + ":" + view.getCurrentMinute()   
                    + "]");   

        }   
    }; //时间改变后执行的内容,用两种方式显示在tv上
    private OnClickListener b1Lis=new OnClickListener(){
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            setTitle(tp.getCurrentHour()+":"+tp.getCurrentMinute());
        }   	
    };//单击按钮后执行的内容,显示时间在标题上
}

DatePicker可以让用户选择时间,免去判断输入时间合法性,下图是效果: 点击按钮,会在标题栏上显示选择的时间。 下面一步一步来实现: main.xml:

<DatePicker 
        android:id="@+id/date_picker"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
<Button android:id="@+id/b1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Click Me"
        />

程序代码:

package com.pocketdigi;

import java.util.Calendar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;

public class main extends Activity {
    /** Called when the activity is first created. */
    DatePicker dp;
    Button b1;
    Calendar c;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        dp=(DatePicker)findViewById(R.id.date_picker);
        dp.init(2010,7,27, null);
        //这里要注意,设置初始时间为2010年8月27日,而不是7月27日,
        //因为这里月份用0-11表示,没有12的,不设置默认显示系统日期
        //下面显示时月份加1道理相同
        b1=(Button)findViewById(R.id.b1); 
        c = Calendar.getInstance();   
        b1.setOnClickListener(bl);

    }
    private OnClickListener bl=new OnClickListener(){
        @Override
        public void onClick(View v) {   
         //下面是读取方法
           setTitle(String.valueOf(dp.getYear())+"年"+String.valueOf(dp.getMonth()+1)+"月"+String.valueOf(dp.getDayOfMonth())+"日");
        }  
        
    };
    
 }

AutoCompleteTextView可以像Google搜索一样,当你在搜索框里输入一些字符时(至少两个字符),会自动弹出一个下拉框提示类似的结果,如下图 极大地提高用户体验。下面我们来一步一步实现这个效果,先是布局xml,main.xml内容:

   <AutoCompleteTextView android:id="@+id/auto_complete"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

接着是程序代码:

package com.pocketdigi;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final String[] strings=new String[]{"abc","abd","abe","bcd","bce","bcf"};
        //预定义字符串
        ArrayAdapter adapter=new ArrayAdapter(this,
                android.R.layout.simple_dropdown_item_1line,strings);
        AutoCompleteTextView actv=(AutoCompleteTextView)findViewById(R.id.auto_complete);
        actv.setThreshold(1);//设置输入多少字符后提示,默认值为2
        actv.setAdapter(adapter);
        
    }
}

取值方法与普通文本框EditText相同

String v=actv.getText().toString();

Spinner是一种下接菜单,类似HTML中的select标签,点击后弹出一个对话框,显示几个供选择的选项,手机屏幕大小有限,如果都用RadioGroup单选按钮,会占用很大的空间。今天的例子最终效果如下图: Spinner需要绑定一个适配器ArrayAdapter,将菜单项放在适配器中,添加删除菜单项只需要调用适配器的add,remove方法即可。 布局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"
    >
<EditText android:id="@+id/et"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>
<Button android:id="@+id/add"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="添加"
/>
<Button android:id="@+id/remove"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="删除"
/>
<Spinner android:id="@+id/sp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>
</LinearLayout>

一个EditText,用于定义需要添加或删除的菜单项,一个添加,一个删除按钮,还有一个就是Spinner 在strings.xml中定义一个初始的数组,就是刚开始时Spinner显示的项目,当然,也可以直接在JAVA代码中定义

    <string-array name="action">
        <item>吃饭</item>
        <item>睡觉</item>
        <item>上网</item>
    </string-array>

JAVA程序代码:

package com.pocketdigi.spanner;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

public class main extends Activity {
    /** Called when the activity is first created. */
    EditText et;
    Button add,remove;
    Spinner sp;
    ArrayList list=new ArrayList();
    ArrayAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        et=(EditText)findViewById(R.id.et);
        add=(Button)findViewById(R.id.add);
        remove=(Button)findViewById(R.id.remove);
        sp=(Spinner)findViewById(R.id.sp);
        //获取相应对象
        String[]  ls=getResources().getStringArray(R.array.action);
        //获取XML中定义的数组
        for(int i=0;i(this,android.R.layout.simple_spinner_item,list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //设置下拉菜单的风格
        sp.setAdapter(adapter);
        //绑定适配器
        sp.setPrompt("标题栏");
        //设置对话框标题栏
        add.setOnClickListener(new OnClickListener(){//添加按钮监听器

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                adapter.add(et.getText().toString());
                //添加输入的项 ,add后自动调用notifyDataSetChanged()
                //如果需要指定位置,使用insert(String s, int index)方法
                setTitle(String.valueOf(list.size()));
                //在标题输出添加后list的大小
            }
            
        });
        remove.setOnClickListener(new OnClickListener(){//删除按钮监听器

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                adapter.remove(sp.getSelectedItem().toString());
                //删除当前选中项,remove后自动调用notifyDataSetChanged()
                setTitle(String.valueOf(list.size()));
            }
            
        });
        
    }
}

源代码打包下载: [download id=”14”]

RadioGroup单选按钮用法,还是先看效果图 先中后,点RadioGroup测试按钮,可在标题栏显示选择结果,点清除可以清除选择。 下面上代码,main.xml:

<RadioGroup
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:checkedButton="@+id/b1"
    android:id="@+id/RG">
<!--默认选中b1-->
    <RadioButton 
        android:text="1"
        android:id="@+id/b1"
    />
     <RadioButton 
        android:text="2"
        android:id="@+id/b2"
    />
     <RadioButton 
        android:text="3"
        android:id="@+id/b3"
    />
</RadioGroup>
<Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/show"
    android:text="RadioGroup测试"
/>
<Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/clear"
    android:text="清除"
/>

程序代码:

package com.pocketdigi;

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

public class main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("RadioGroup测试");
        setContentView(R.layout.main);
        RGDemo();
    }
    RadioGroup rg;
    RadioButton b1;
    RadioButton b2;
    RadioButton b3;
    public void RGDemo(){
        rg=(RadioGroup)findViewById(R.id.RG);
        b1=(RadioButton)findViewById(R.id.b1);
        b2=(RadioButton)findViewById(R.id.b2);
        b3=(RadioButton)findViewById(R.id.b3);
        Button clr=(Button)findViewById(R.id.clear);
        clr.setOnClickListener(clear);
        Button echo=(Button)findViewById(R.id.show);
        echo.setOnClickListener(show);
    }
    private Button.OnClickListener clear=new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            rg.clearCheck();
            setTitle("RadioGroup测试");
        }
        
    };
    private OnClickListener show=new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(b1.isChecked()){
                setTitle("1");
            }
            if(b2.isChecked()){
                setTitle("2");
            }
            if(b3.isChecked()){
                setTitle("3");
            }
        }
        
    };
}

RadioGroup有一个onCheckChangeListener监听器,可以通过监听器的onCheckedChanged方法捕捉到点击事件,onCheckedChanged方法会传入一个int型的checkedId,可以通过对比传入的checkedId和RadioButton的ID,来确定被点中的选项。

        rg.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                if(checkedId==b1.getId()){
                    Toast.makeText(main.this,"b1选中", Toast.LENGTH_LONG).show();
                }
                if(checkedId==b2.getId()){
                    Toast.makeText(main.this,"b2选中", Toast.LENGTH_LONG).show();
                }
                if(checkedId==b3.getId()){
                    Toast.makeText(main.this,"b3选中", Toast.LENGTH_LONG).show();
                }
                
                
            }
            
        });

CheckBox复选框用法,先看效果图 选择点击按钮后,会在标题栏显示选中的项。 main.xml代码:

<CheckBox android:id="@+id/box1"
          android:text="我是BOX1"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
/>
<CheckBox android:id="@+id/box2"
          android:text="我是BOX2"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
/>
<Button android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按我"
/>

主程序代码:

package com.pocketdigi;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;

public class main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        boxDemo();
        
    }
    CheckBox box1;
    CheckBox box2;
    private void boxDemo(){
        box1=(CheckBox)findViewById(R.id.box1);
        box2=(CheckBox)findViewById(R.id.box2);
        Button b1=(Button)findViewById(R.id.b1);
        b1.setOnClickListener(Dialog);
    }
    private Button.OnClickListener Dialog=new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String s="";
            if(box1.isChecked()){
                s+="box1,";
            }
            if(box2.isChecked()){
                s+="box2";
            }
            setTitle(s);
        }
        
    };
}

有时候AlertDialog上的按钮,文本并不能满足我们程序的要求,比如说我们要设计个登录窗口,如果用上文的方法是没法插入EditText的,也就无法实现。其实AlertDialog是可以显示View的,这样的话,几乎任何元素都可以在AlertDialog中显示。 先看效果图: 下面我们用代码一步一步实现。 先讲思路,首先写个view的XML文件,把登录框的提示以用输入框写进去,然后把xml文件转成View类型,再用setView()即可。 下面是我写好的xml文件,文件名为login.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"
    >
<TextView android:text="用户名"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_marginLeft="10dip"
          android:textSize="25px"
        />
<EditText android:id="@+id/usr"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_margin="10dip"
/>
<TextView android:text="密码"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_marginLeft="10dip"
          android:textSize="25px"
        />
<EditText android:id="@+id/pwd"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_margin="10dip"
/>
</LinearLayout>

接下来是程序代码:

package com.pocketdigi.test;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button=(Button)findViewById(R.id.b1);
        button.setOnClickListener(openDialog);
    }

    private OnClickListener openDialog=new OnClickListener(){
        @Override
        public void onClick(View v) {
            Login();//点击执行弹出登录对话框
        }


    };
    public void Login() {
        LayoutInflater factory=LayoutInflater.from(main.this);
        final View v1=factory.inflate(R.layout.login,null);
                         //R.layout.login与login.xml文件名对应,把login转化成View类型
        AlertDialog.Builder dialog=new AlertDialog.Builder(main.this);
        dialog.setTitle("用户登录");
        dialog.setView(v1);//设置使用View
                          //设置控件应该用v1.findViewById 否则出错
        dialog.setPositiveButton("登录", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {

                //登录代码
            }
        });
        dialog.setNegativeButton("取消",new DialogInterface.OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                
            }
        });
        dialog.show();
    }
}

弹出对话框AlertDialog用法,先看效果图,点击官方网站会跳转 下面用代码实现:

private void openOptionsDialog(){//打开对话框

        AlertDialog.Builder ad=new AlertDialog.Builder(main.this);
/*
setTitle():给对话框设置title.
setIcon():给对话框设置图标。
setMessage():设置对话框的提示信息
setItems():设置对话框要显示的一个list,一般用于要显示几个命令时
setSingleChoiceItems():设置对话框显示一个单选的List
setMultiChoiceItems():用来设置对话框显示一系列的复选框。
setPositiveButton():给对话框添加”Yes”按钮。
setNegativeButton():给对话框添加”No”按钮。
show():显示对话框,一般放最后
*/

        ad.setTitle(R.string.about_title);//设置对话框标题
        ad.setMessage(R.string.about_message);//设置对话框内容
        ad.setPositiveButton("确认", new DialogInterface.OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int i) {
                // TODO Auto-generated method stub
                
            }
        });
        ad.setNegativeButton("官方网站",new DialogInterface.OnClickListener() {
            //显示官方网站按钮,点击打开浏览器,转向www.pocketdigi.com
            @Override
            public void onClick(DialogInterface dialog, int i) {
                Uri uri=Uri.parse("http://www.pocketdigi.com");
                Intent intent=new Intent(Intent.ACTION_VIEW,uri);
                // TODO Auto-generated method stub
                startActivity(intent);
            }
        });
        ad.show();//显示对话框

        
    }

一个Activity就相当于程序的一页,如果想要跳转到新的一页,就必须插入新的Activity。 插入新的Activity有三步骤: 1、建立新的Activity程序代码,这里以”new.class”为例 2、在AndroidManifest.xml中添加新Activity的描述 3、在原有Activity中调用启动新的Activity 下面一步一步来,首先建立新的Activity程序代码: 在Eclipse左侧的Package Explorer中的src下的package上点右键,New一个Class。有一点要注意,在弹出的对话框中,Superclass要选择Activity,Name必须大写(这是JAVA的规定,必须这样,否则无法建立) ,在新建的Name.class里插入代码:

public class Name extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new);
    }
}

然后建立相应的描述UI的xml文件,格式复制原有main.xml的格式即可,根据上面的代码(R.layout.new),这个xml文件名应该为new.xml。 接下来第二步,在AndroidManifest.xml中添加新Activity的描述 打开AndroidManifest.xml,切换到Application页面,在Application Nodes里,列出了这个程序目前所有的Activity(当然不包括我们现在要添加的),点右边的Add,如图: 点击OK,打开AndroidManifest.xml,加入

<activity android:name="Name"></activity> 

然后是在原有Activity中调用启动新的Activity

Intent intent=new Intent();
intent.setClass(Test.this,Name.class);//当前的Activity为Test,目标Activity为Name
//从下面这行开始是将数据传给新的Activity,如果不传数据,只是简单的跳转,这几行代码请注释掉
Bundle bundle=new Bundle();
bundle.putString("key1","value1");//key1为名,value1为值
bundle.putString("key2","value2");
intent.putExtras(bundle);
//传数据结束
startActivity(intent);

到这里,新的Activity就被制调用了,如果刚才在原Activity中传送了数据,用下面的代码可以在新的Activity中获取到。

Bundle bundle=this.getIntent().getExtras();
String s1=bundle.getString("key1");
String s2=bundle.getString("key2");

Android UI设计 按钮Button控件用法 main.xml中:

 <Button android:id="@+id/calc"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/calc"
 />

string.xml中:

<string name="calc">计算BMI</string>

程序中调用:

Button button=(Button)findViewById(R.id.calc);
button.setOnClickListener(jump);//点击后运行jump
private OnClickListener jump=new OnClickListener(){//定义jump
        @Override
        public void onClick(View v) {
                        //这里插入点击后运行的程序代码
        }