Android应用开发揭秘(笔记) 第四章用户界面开发(第二部分)

来源:互联网 发布:互助系统php源代码 编辑:程序博客网 时间:2024/05/18 16:17

11.菜单(Menu):
实现方法:首先通过方法onCreateOptionsMenu来创建菜单,然后需要对其能够出家的事件进行监听,通过事件监听onOptionsItemSelected中不同
的菜单项来执行不同操作。可以通过xml布局实现,也可以通过menu.add方法来实现。
△ 通过xml布局实现:首先在项目目录的"res"创建一个menu文件夹,然后再其中创建需要的菜单,然后再onCreateOptionsMenu方法中通过onCreateOptionsMenu方法
来装载这个布局文件。在onOptionsItemSelected监听方法中通过getItemId方法获得当前选中的菜单的“ID”。
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/about"
          android:title="关于" />
    <item android:id="@+id/exit"
          android:title="退出" />
</menu>
代码如下:
 /*创建menu*/
 public boolean onCreateOptionsMenu(Menu menu)
 {
  MenuInflater inflater = getMenuInflater();
  //设置menu界面为res/menu/menu.xml
  inflater.inflate(R.menu.menu, menu);
  return true;
 }

 /*处理菜单事件*/
 public boolean onOptionsItemSelected(MenuItem item)
 {
  //得到当前选中的MenuItem的ID,
  int item_id = item.getItemId();

  switch (item_id)
  {
   case R.id.about:
    /* 新建一个Intent对象 */
    Intent intent = new Intent();
    /* 指定intent要启动的类 */
    intent.setClass(Activity01.this, Activity02.class);
    /* 启动一个新的Activity */
    startActivity(intent);
    /* 关闭当前的Activity */
    Activity01.this.finish();
    break;
   case R.id.exit:
    Activity01.this.finish();
    break;
  }
  return true;
 }

△ 通过menu.add方法来实现:即在onCreateOptionsMenu方法中通过“menu.add(0,)”
        /*创建menu*/
 public boolean onCreateOptionsMenu(Menu menu)
 {
  //为menu添加内容
  menu.add(0, 0, 0, R.string.ok);
  menu.add(0, 1, 1, R.string.back);
  return true;
 }

 /*处理menu的事件*/
 public boolean onOptionsItemSelected(MenuItem item)
 {
  //得到当前选中的MenuItem的ID,
  int item_id = item.getItemId();

  switch (item_id)
  {
   case 0:
   case 1:
    /* 新建一个Intent对象 */
    Intent intent = new Intent();
    /* 指定intent要启动的类 */
    intent.setClass(Activity02.this, Activity01.class);
    /* 启动一个新的Activity */
    startActivity(intent);
    /* 关闭当前的Activity */
    Activity02.this.finish();
    break;
  }
  return true;
 }

12 对话框(Dialog):Android中实现可以使用AlertDialog.Builder类,还可以自定义对话框。如果对话框设置了按钮,就需要设置事件监听onClickListener。
xml中:android:textAppearance="?android:attr/textAppearanceMedium",布局里设置文字的外观。

13图片视图(ImageView):在屏幕上显示一张图片。通过setImageResources方法来设置要显示的图片资源索引。
xml布局:
<ImageView
 android:id="@+id/ImageView01"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
>
</ImageView>
代码实现:
 //获得ImageView的对象
 ImageView imageview = (ImageView) this.findViewById(R.id.ImageView01);
 //设置imageview的图片资源。同样可以再xml布局中像下面这样写
 //android:src="@drawable/logo"
 imageview.setImageResource(R.drawable.logo);
 //设置imageview的Alpha值
 imageview.setAlpha(image_alpha);

14带图标的按钮(ImageButton):
实现方法:首先定布局文件中定义ImageButton,然后通过setImageDrawable方法来设置要显示的按钮图标。同样通过设置事件监听setOnClickListener。
xml布局:
<ImageButton
 android:id="@+id/ImageButton01"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 //android:src="@drawable/button1"
>
</ImageButton>
代码实现:ImageButton imagebutton1 = (ImageButton)findViewById(R.id.ImageButton01);
  imagebutton1.setImageDrawable(getResources().getDrawable(R.drawable.button1 ) );
 imagebutton1.setOnClickListener( new Button.OnClickListener(){
 public void onClick( View view ){
  //do someting...
 }

});

 

15.拖动效果(Gallery):
实现方法:需要一个容器存放Gallery显示图片,使用一个继承自BaseAdapter类的派生类来装这些图片。通过监听事件setOnItemClickListener,得到选中的是哪一张图片。
还需要将所有图片的索引存放在一个int型数组中,然后通过setImageResources方法来设置ImageView显示图片,将每张ImageView显示在屏幕上。
Gallery xml布局:
<Gallery
xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/Gallery01"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
/>

Gallery代码实现:

    //获得Gallery对象
        Gallery g = (Gallery) findViewById(R.id.Gallery01);

        //添加ImageAdapter给Gallery对象
        g.setAdapter(new ImageAdapter(this));

        //设置Gallery的背景
        g.setBackgroundResource(R.drawable.bg0);
        
        //设置Gallery的事件监听
        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Toast.makeText(Activity01.this,"你选择了"+(position+1)+" 号图片",
                    Toast.LENGTH_SHORT).show();
            }
        });

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class ImageAdapter extends BaseAdapter
{
    // 定义Context
    private Context        mContext;        
    // 定义整型数组 即图片源
    private Integer[]    mImageIds =
    {                         
            R.drawable.img1,
            R.drawable.img2,
            R.drawable.img3,
            R.drawable.img4,
            R.drawable.img5,
            R.drawable.img6,
            R.drawable.img7,
            R.drawable.img8,        
    };

    // 声明 ImageAdapter
    public ImageAdapter(Context c)
    {
        mContext = c;
    }

    // 获取图片的个数
    public int getCount()
    {
        return mImageIds.length;
    }

    // 获取图片在库中的位置
    public Object getItem(int position)
    {
        return position;
    }

    // 获取图片ID
    public long getItemId(int position)
    {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        ImageView imageview = new ImageView(mContext);

        // 给ImageView设置资源
        imageview.setImageResource(mImageIds[position]);
        // 设置布局 图片120×120显示
        imageview.setLayoutParams(new Gallery.LayoutParams(120, 120));
        // 设置显示比例类型
        imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
        return imageview;
    }
}

16.切换图片(ImageSwitcher):
实现方法:ImageSwitcher类必须设置一个ViewSwitcher.ViewFactory,通过makeView()方法用来显示图片和父窗口区分开来。makeView()会返回一个ImageView
对象,通过setImageResouces来显示指定的图片资源。
代码实现部分:
Activity实现了(implements)ViewFactory类
         //创建一个线性布局LinearLayout
        LinearLayout main_view = new LinearLayout(this);
        //创建ImageSwitcher对象
        m_Switcher = new ImageSwitcher(this);
        //在线性布局中添加ImageSwitcher视图
        main_view.addView(m_Switcher);
        //设置ImageSwitcher对象的ID
        m_Switcher.setId(SWITCHER_ID);
        //设置ImageSwitcher对象的数据源
        m_Switcher.setFactory(this);
        //index通过button 来改变这个索引值
        m_Switcher.setImageResource(imagelist[index]);
        
        //设置显示上面创建的线性布局
        setContentView(main_view);

    public View makeView()
    {
        //将所有图片通过ImageView来显示
        return new ImageView(this);
    }

17.网络视图(GridView):显示多个元素。
实现方法:首先使用BaseAdapter来存储这些元素。通过事件监听setOnItemClickListener来捕捉事件。
GridView xml布局:
GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:columnWidth="90dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>
定义一个ImageAdapter继承BaseAdapter,该类与Gallery中的ImageAdapter类似。
Activity部分代码:
    //取得GridView对象
        GridView gridview = (GridView) findViewById(R.id.gridview);
        //添加元素给gridview
        gridview.setAdapter(new ImageAdapter(this));

        // 设置Gallery的背景
        gridview.setBackgroundResource(R.drawable.bg0);

        //事件监听
        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
                Toast.makeText(Activity01.this, "你选择了" + (position + 1) + " 号图片", Toast.LENGTH_SHORT).show();
            }
        });

18.卷轴视图(ScrollView):主要用于元素超过一个屏幕,通过使用ScrollView来实现滚动视图。
ScrollView xml布局:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ScrollView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none">
    <LinearLayout
        android:id="@+id/layout"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="TextView0"/>

        <Button
           android:id="@+id/Button01"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Button0"/>
    </LinearLayout>
</ScrollView>
代码实现部分:

//创建一个线性布局
      LinearLayout  mLayout = (LinearLayout) findViewById(R.id.layout);   
        //创建一个ScrollView对象
      ScrollView  mScrollView = (ScrollView) findViewById(R.id.ScrollView01);   

19.进度条(ProgressBar):Android提供两种进度条,一种是长型进度条(ProgressBarStyleHorizontal),一种是圆形进度条(progressBarStyleLarge)。
progressBar xml布局:
<ProgressBar
    android:id="@+id/ProgressBar01"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:visibility="gone"//将对象显示或者隐藏
  />
  <ProgressBar
      android:id="@+id/ProgressBar02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleLarge"
        android:max="100"//最大值
        android:progress="50"//当前值
        android:secondaryProgress="70"
    android:visibility="gone"//将对象显示或者隐藏
  />
代码部分:略

20.拖动条(SeekBar):一般在应用主要用于音效控制。
实现方法:首选需要设置SeekBar.OnSeekBarChangeListener接口。并且还需要监听3个事件,分别是:数值的改变(onProgressChanged)、开始拖动(onStartTrackingTouch)、
停止拖动(onStopTrackingTouch)。
SeekBar xml布局:
<SeekBar android:id="@+id/seek"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:max="100"//最大值
        android:progress="50"//当前值
        android:secondaryProgress="75" />

代码部分:
SeekBar mSeekBar = (SeekBar) findViewById(R.id.seek);
mSeekBar.setOnSeekBarChangeListener(this);

//在拖动中--即值在改变
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch)
    {
        mProgressText.setText("当前值:"+progress);
    }
    public void onStartTrackingTouch(SeekBar seekBar)
    {
        mTrackingText.setText("正在调节");
    }
    //停止拖动
    public void onStopTrackingTouch(SeekBar seekBar)
    {
        mTrackingText.setText("停止调节");
    }

21,状态栏提示(Notification、NotificationManager):用于处理一些还未及时处理的信息,例如未接电话和短信。
实现方法:首先通过getSystemService方法得到NotificationManager对象,对Notification的内容。图标、标题等属性进行设置,然后通过notify方法
来执行一个Notification快讯。
代码部分:
//初始化NotificationManager对象
m_NotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//点击通知时转移内容
        m_Intent = new Intent(Activity01.this, Activity02.class);
        //主要是设置点击通知时显示内容的类
        m_PendingIntent = PendingIntent.getActivity(Activity01.this, 0, m_Intent, 0);
        //构造Notification对象
        m_Notification = new Notification();

        m_Button1.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v)
            {
                //设置通知在状态栏显示的图标
                m_Notification.icon = R.drawable.img1;
                //当我们点击通知时显示的内容
                m_Notification.tickerText = "Button1通知内容...........";
                //通知时发出默认的声音
                m_Notification.defaults = Notification.DEFAULT_SOUND;
                //设置通知显示的参数
                m_Notification.setLatestEventInfo(Activity01.this, "Button1", "Button1通知", m_PendingIntent);
                //可以理解为执行这个通知
                m_NotificationManager.notify(0, m_Notification);
            }
        });

22.对话框中的进度条(ProgressDialog):
代码实现部分:
//创建ProgressDialog对象
                m_pDialog = new ProgressDialog(Activity01.this);

                // 设置进度条风格,风格为圆形,旋转的
                m_pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

                // 设置ProgressDialog 标题
                m_pDialog.setTitle("提示");
                
                // 设置ProgressDialog 提示信息
                m_pDialog.setMessage("这是一个圆形进度条对话框");

                // 设置ProgressDialog 标题图标
                m_pDialog.setIcon(R.drawable.img1);

                // 设置ProgressDialog 的进度条是否不明确
                m_pDialog.setIndeterminate(false);
                
                // 设置ProgressDialog 是否可以按退回按键取消
                m_pDialog.setCancelable(true);
                
                // 设置ProgressDialog 的一个Button
                m_pDialog.setButton("确定", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int i)
                    {
                        //点击“确定按钮”取消对话框
                        dialog.cancel();
                    }
                });

                // 让ProgressDialog显示
                m_pDialog.show();

☆界面布局:
常见的布局框架包括:
1.LinearLayer(线性布局)可以垂直线性布局,也可以水平线性布局。可以放多控件,但是一列(一行)只能放一个。
android:orientation="vertical"声明了这个线性布局以垂直的方式排列。

2.RelativeLayout(相对布局)可以放多控件,不过控件的位置是相对的。
RelativeLayout主要参数有:Width,Height,Below,AlignTop,TopLeft,Pading,MarginLeft
Below,AlignTop,TopLeft用来指定相对于其他元素的下、上、左的位置。

3.TableLayout(表单布局)需要和TableRow配合使用。
4.TabWidget(切换卡)。继承自TabActivity,实现标签切换实现显示不同内容的功能。
5.FrameLayout
6.AbsoluteLayout:可以自定义控件的x,y的位置。

小结:
1.本章主要介绍了Android中常用的一些标签,在xml中的布局、以及代码的实现。
2.一些常用标签的事件监听的方法与实现。
3.介绍了Android一些常用的布局例如(LinearLayout、RelativeLayout)。