Android 學習(三)下: UI 控件

·
·點此進入上篇:
Android 學習(三)上: UI 控件
·
·
·
·
·AnalogClock和DigitalClock

// 獲得當前的時間,獲得小時和分鐘
Calendar calendar = Calendar.getInstance();
hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);// 獲得當前的秒
year = calendar.get(Calendar.YEAR);
monthOfYear = calendar.get(Calendar.MONTH);
dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
        TimePickerDialog timePickerDialog = new TimePickerDialog(Main.this,
                new MyTimePickerDialog(), hourOfDay, minute, true);
        timePickerDialog.show();// 顯示對話框
        break;
    case R.id.button2:
        DatePickerDialog datePickerDialog = new DatePickerDialog(Main.this,
                new MyDatePickerDialog(), year, monthOfYear, dayOfMonth);
        datePickerDialog.show();// 顯示對話框
        break;
    }
}
public class MyDatePickerDialog implements
        DatePickerDialog.OnDateSetListener {
    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        Toast.makeText(Main.this, "year:" + year + "monthOfYear:" + monthOfYear + "dayOfMonth:" + dayOfMonth, 1).show();
    }
}
public class MyTimePickerDialog implements
        TimePickerDialog.OnTimeSetListener {
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Toast.makeText(Main.this, "hourOfDay:" + hourOfDay + "minute:" + minute, 1).show();
    }
}

·ProgressBar:
OnCreate下:

// 如何設置窗口有刻度的效果
requestWindowFeature(Window.FEATURE_PROGRESS);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
progressBar = (ProgressBar) this.findViewById(R.id.progressbar);
setProgressBarVisibility(true);
setProgressBarIndeterminate(true);
setProgress(3500);
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.button1:
        progressBar.setProgress((int) (progressBar.getProgress() * 1.2));
        progressBar.setSecondaryProgress((int) (progressBar
                .getSecondaryProgress() * 1.2));
        break;
    case R.id.button2:
        progressBar.setProgress((int) (progressBar.getProgress() * 0.8));
        progressBar.setSecondaryProgress((int) (progressBar
                .getSecondaryProgress() * 0.8));
        break;
    }
}

·RatingBar 評分控件
OnCreate下

ratingBar.setMax(100);// 設置最大刻度
ratingBar.setProgress(20);// 設置當前的刻度
ratingBar.setOnRatingBarChangeListener(this);
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
        boolean fromUser) {
    // TODO Auto-generated method stub
    int progress = ratingBar.getProgress();
    Toast.makeText(Main.this, "progress:" + progress + "rating:" + rating,
            1).show();
}

·ScrollView 垂直滾動控件


    
        
    

·HorizontalScrollView 水平滾動控件


    
        
    

·Gallery 畫廊控件
·隻能顯示一行,而且支持水平滑動效果

package com.android.mygallery;
 
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
 
public class Main extends Activity {
    /** Called when the activity is first created. */
    private Gallery gallery;
    private ImageAdapter imageAdapter;
    // 聲明圖片的數組
    private int[] resIds = { R.drawable.item1, R.drawable.item2,
            R.drawable.item3, R.drawable.item4, R.drawable.item5,
            R.drawable.item6, R.drawable.item7, R.drawable.item8,
            R.drawable.item9, R.drawable.item10, R.drawable.item11,
            R.drawable.item12, R.drawable.item13, R.drawable.item14,
            R.drawable.item15 };
    // android的適配器
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        gallery = (Gallery) this.findViewById(R.id.gallery);
        imageAdapter = new ImageAdapter(this);
        gallery.setAdapter(imageAdapter);
    }
    public class ImageAdapter extends BaseAdapter {
        private Context context;
        int mGralleyItemBackground;// 使用簡單的計數器,填充背景圖片
        public ImageAdapter(Context context) {
            this.context = context;
            // 讀取屬性
            TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
            mGralleyItemBackground = typedArray.getResourceId(
                    R.styleable.Gallery_android_galleryItemBackground, 0);
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return Integer.MAX_VALUE;
        }
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return resIds[position];
        }
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            // 自定義的適配器,需要用自定義的佈局來顯示,通常android的通用佈局是不能滿足我們的需求
            // 可以手工創建一個View視圖,也可以inflate填充一個XML
            // 從數據源中根據position 獲得每一個Item的值,填充到指定的XML佈局中
            // View convertView 是一個舊的佈局,如果沒有新的佈局填充的時候,將使用舊的佈局
            // 當前的佈局,會被追加到父佈局中
            ImageView imageView = new ImageView(context);
            imageView.setImageResource(resIds[position % resIds.length]);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));
            imageView.setBackgroundResource(mGralleyItemBackground);
            return imageView;
        }
    }
}

·PopupWindow
·?PopupWindow 可以創建類似對話框風格的窗口,使用PopupWindow創建對話框風格的窗口隻要實現兩個步驟即可:
·?1、調用PopupWindow的構造器創建PopupWindow對象
·?2、調用PopupWindow的showAsDropDown(View view)方法將PopupWindow作為view的組件的下拉組件顯示出來,或者調用PopupWindow的showAtLocation方法將PopupWindow在指定的位置顯示出來。
·
·ImageSwitcher圖片切換控件
·?ImageSwitcher控件可以用在不同的圖像之間切換,其中切換的過程可以采用動畫的方法,如淡入淡出的效果。
·?ImageSwitcher需要一個圖像工廠(ViewFactory)來創建用於顯示圖像的ImageView對象,因此我們需要一個實現android.widget.ViewSwitcher.ViewFactory接口的類。
·
·GridView網格控件
·?GridView控件用於顯示一個網格圖像, GridView主要是用在一些相冊的佈局顯示圖片。
·?GridView采用的是二維表的方式顯示單元格,就需要設置二維表的行和列。設置GridView的列可以使用標簽的columnWidth屬性。也可以使用GridView類的setColumnWidth方法來設置列數,
·?GridView中的單元格會根據列數自動拆行顯示,因此不需要設置GridView的行數,但是需要設置android:numColumns屬性。否則GridView隻會顯示一行。
·
·Spinner下拉列表控件
·?Spinner控件用於顯示一個下拉列表,該控件在裝載數據的時候需要創建一個Adapter適配器對象。並在創建Adapter對象過程中指定要裝載的數據是數組或者是List對象的數據
·1.MyAdapter.java

package com.android.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.android.myspinner.R;
public class MyAdapter {
    public MyAdapter() {}
    public static List getData() {
        List list = new ArrayList();
        list.add("北京");
        list.add("上海");
        list.add("廣州");
        return list;
    }
    public static List<Map> getListMaps() {
        List<Map> list = new ArrayList<Map>();
        Map map1 = new HashMap();
        map1.put("ivLogo", R.drawable.calendar);
        map1.put("applicationName", "日歷");
 
        Map map2 = new HashMap();
        map2.put("ivLogo", R.drawable.eoemarket);
        map2.put("applicationName", "eoemarket客戶端");
        list.add(map1);
        list.add(map2);
        return list;
    }
}

·2.OnCreate當中實現:

spinner = (Spinner) this.findViewById(R.id.spinner);
List list = MyAdapter.getData();
ArrayAdapter adapter = new ArrayAdapter(Main.this,
        android.R.layout.simple_spinner_item, list);
spinner.setAdapter(adapter);
spinner2 = (Spinner) this.findViewById(R.id.spinner2);
// List<Map>
List<Map> listmaps = MyAdapter.getListMaps();
SimpleAdapter simpleAdapter = new SimpleAdapter(Main.this, listmaps,
        R.layout.item, new String[] { "ivLogo", "applicationName" },
        new int[] { R.id.imageview, R.id.textview });
spinner2.setAdapter(simpleAdapter);
spinner2.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView parent, View view,
            int position, long id) {
        // TODO Auto-generated method stub
        String appName = ((Map) spinner2
                .getItemAtPosition(position)).get("applicationName")
                .toString();
        setTitle(appName);
    }
    @Override
    public void onNothingSelected(AdapterView parent) {
    }
});

·TabHost標簽控件

?如果在屏幕上要放置很多的控件,可能一個屏放不下,除瞭使用滾動視圖的方式外,還可以使用標簽控件對屏幕進行分頁顯示,當單擊標簽控件的不同標簽時,會顯示當前標簽的內容,

在android系統中一個標簽可以是一個View或者是Activity

?TabHost是標簽控件的核心類,也是一個標簽的集合,每一個標簽是TabHost.TabSpec對象。通過TabHost類的addTab的方法添加多個TabHost.TabSpec對象。

·
·ViewStub惰性裝載控件

?之前我們介紹過標簽,該標簽可以再佈局文件中引用另外一個佈局文件,這種方式是在佈局文件中固定導入,使用起來不是很方便。

?ViewtSub的功能和的功能類似,也是實現引用另外一個佈局。但是唯一不同的是ViewStub並不會馬上裝載引用佈局文件,

隻有在調用瞭ViewStub.inflate或ViewStub.setVisibility(View.VISIBILE)方法ViewStub才會裝載引用的控件。

·
·ViewPager多頁面滑動效果: 略
·
·ListView列表控件

?Android中的列表控件飛創靈活,可以自定義每一個列表項,實際上每一個列表項就是一個View,

在Android定義瞭3個列表控件:ListView、ExpandableListView和Spinner,其中Spinner就是在Windows中常見的下拉列表框。

?ListView控件用於列表的形式顯示數據, ListView控件采用MVC模式將前端顯示和後端數據進行分離。

也就是說, ListView控件在裝載數據時並不是直接使用ListView.add或者類似的方法添加數據,而是需要指定一個Adapter對象。

該對象相當於MVC模式中的C(控制器,Controller)。ListView相當於MVC模式中的V(視圖,View),用於顯示數據。為ListView提供數據的List或數組相當於MVC模式中的M(模型,Model)

?在ListView控件中通過Adapter對象獲得需要顯示的數據,在創建Adapter對象時需要指定要顯示的數據(List或數組對象),

因此,要顯示的數據與ListView之間通過Adapter對象進行連接,同時又互相獨立,也就是說,ListView隻知道顯示的數據來自Adapter,並不知道這些數據來自List還是數組。

?對於數據本身來說,隻是知道將這些數據添加到Adapter對象中,並不知道這些數據會被用於ListView控件或其他控。

vcq9saO05qOs1NpFY2xpcGVz1tDWsb3TtPK/qr7Nv8nS1L+0tb3J6LzGyMvUscnovMa1xL3nw+ahowoKwt+8rbSmwO21xLT6wuvU8rfF1NpzcmPOxLz+vNDPwqGjyMOzzNDy1LG4/Neo16LT69K1zvGhowoKCgo/MSkgytPNvLLjKFZpZXcpo7rSu7DjssnTw1hNTM7EvP69+NDQvefD5rXEw+jK9qOsyrnTw7XEyrG68r/J0tS3x7Ojt72x47XE0v3I66GjCgoKCj/NrMqxsePT2rrzxtq958PmtcTQ3rjEoaPC37yt1tDT673nw+a21NOmtcRpZLK7seS7r9TytPrC67K708PQ3rjEo6y087Tz1PbHv8HLtPrC67XEv8nOrLuk0NShowoKCgo/Mikgv9jWxrLjKENvbnRyb2xsZXIpo7pBbmRyb2lktcS/2NbGsuO1xNbYyM7NqLOjwuTU2sHL1tq24LXEQWNpdHZpdHm1xLznyc+jrNXivuS7sNKyvs2wtbqswcuyu9Kq1NpBY2l0aXZpdHnW0NC0tPrC66OsCgrSqs2ouf1BY3Rpdml0eb27uO5Nb2RlbNK1zvHC37ytsuO0psDto6zV4tH51/a1xMHtzeLSu7j21K3S8srHQW5kcm9pZNbQtcRBY2l0aXZpdHm1xM/s06bKsbzkysc1c6OsyOe5+7rEyrG1xLLZ1/e3xdTa1eLA76Oss8zQ8r7NutzI3dLXsbu72MrVtfShowoKCgo/MykgxKPQzbLjKE1vZGVsKaO6ttTK/b7dv+K1xLLZ1/ehorbUzfjC57XItcSy2df3trzTprjD1NpNb2RlbMDvw+a0psDto6y1sci7ttTStc7xvMbL47XIstnX99Kyysex2NDrt8XU2rXEuMOy47XEoaO+zcrH06bTw7PM0PLW0Lb+vfjWxrXEyv2+3aGjCgo8cHJlIGNsYXNzPQ==”brush:java;”>

·MyDataSource.java

package com.android.android_listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyDataSource {
    public MyDataSource() {}
    public static List<Map> getMaps() {
        List<Map> listMaps = new ArrayList<Map>();
        Map map1 = new HashMap();
        map1.put("pname", "西瓜");
        map1.put("price", "$2.30");
        map1.put("address", "廣西");
        Map map2 = new HashMap();
        map2.put("pname", "香蕉");
        map2.put("price", "$9.30");
        map2.put("address", "浙江");     
        Map map3 = new HashMap();
        map3.put("pname", "蘋果");
        map3.put("price", "$99.99");
        map3.put("address", "USA");        
        listMaps.add(map1);
        listMaps.add(map2);
        listMaps.add(map3);
        return listMaps;
    }
}

·MainActivity.java

package com.android.android_listview;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
    private ListView listView;
    private SimpleAdapter adapter;
    private List<Map> data = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) this.findViewById(R.id.listview);
        data = MyDataSource.getMaps();
        adapter = new SimpleAdapter(MainActivity.this, data,
                R.layout.activity_main, new String[] { "pname", "price",
                        "address" }, new int[] { R.id.pname, R.id.price,
                        R.id.address });
        listView.setAdapter(adapter);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

·
·
·
Over

發佈留言