Android入门笔记 - 界面开发 - Menu,Dialog

好了,进入界面开发的第三篇,今天我们要看的是Menu和Dilog:

Menu:菜单
Dialog: 对话框
首先还是贴代码:

(1)layout/activity_main.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
	
    
</LinearLayout>




(空文件都贴出来,神经病??)

(2)layout/dailog.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" >
    
	<TextView
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="账号:" 
	    />
	<EditText
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:id="@+id/et_username" 
	    android:autoText="true"
	    />
	
	<TextView
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="密码:" 
	    />
	<EditText
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:id="@+id/et_password" 
	    android:autoText="true"
	    />
	
</LinearLayout>



(3)res/menu/main.xml ( menu的配置文件)
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/about"
        android:title="关于"/>
    <item
        android:id="@+id/out"
        android:title="退出"/>

    <group android:id="@+id/group1" >
        <item
            android:id="@+id/item1"
            android:title="item1">
        </item>
        <item
            android:id="@+id/item2"
            android:title="item2">
        </item>
        <item
            android:id="@+id/item2"
            android:title="item2">
        </item>
    </group>

</menu>



(4)MainActivity.java:
package com.example.demo_ui2;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
	private Context mCtx;
	private ProgressDialog mProgressDialog;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mCtx = MainActivity.this;
		
		// 对话框
		// 1.使用AlertDialog创建对话框
		Dialog dialog = new AlertDialog.Builder(mCtx)
				.setTitle("登陆提示")
				.setMessage("这里需要登陆!")
				.setPositiveButton("确定"	, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						LayoutInflater inflater = LayoutInflater.from(mCtx);
						View dialogView = inflater.inflate(R.layout.dialog, null);
						AlertDialog dlg = new AlertDialog.Builder(mCtx)
							.setTitle("登陆框")
							.setView(dialogView)
							.setPositiveButton("确定", new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog, int which) {
									mProgressDialog = new ProgressDialog(mCtx);
									mProgressDialog.setTitle("登陆中");
									mProgressDialog.setMessage("请稍后..");
									mProgressDialog.setCancelable(true);
									mProgressDialog.show();
									new Thread() {
										@Override
										public void run() {
											try{
												sleep(10000);
											} catch(Exception e){
												e.printStackTrace();
											} finally{
												mProgressDialog.dismiss();
											}
										}
									}.start();
								}
							})
							.setNegativeButton("退出", new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog, int which) {
									MainActivity.this.finish();
								}
							})
							.create();
						dlg.show();
					}
				})
				.setNegativeButton("退出", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						MainActivity.this.finish();
					}
				})
				.setNeutralButton("隐藏", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						
					}
				})
				.create();
				dialog.show();
	}

	//创建menu
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater= getMenuInflater();
		inflater.inflate(R.menu.main, menu);
		return true;
	}
	
	//menu的按键事件
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		int itemId = item.getItemId();
		switch(itemId){
		case R.id.item1:
			showToast("item1");
			break;
		case R.id.item2:
			showToast("item2");
			break;
		case R.id.about:
			showToast("about");
			break;
		case R.id.out:
			finish();
			break;
		}
		return super.onMenuItemSelected(featureId, item);
	}
	
	private void showToast(String content){
		Toast.makeText(mCtx, content, Toast.LENGTH_SHORT).show();
	}

}




进入解释篇:

Menu:

我们这里采用的xml文件配置menu的方式,当 然也有其他方法,这里当然讲最简单易懂的方法。 res/menu/ 目录专门用来配置 menu的资源文件夹,放在menu/目录下的xml文件都将作为菜单资源被引用,根节点是menu,里面的项目有item 和 group 两种,顾名思义吧,你懂的。

配置:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/about"
        android:title="关于"/>
    <item
        android:id="@+id/out"
        android:title="退出"/>

    <group android:id="@+id/group1" >
        <item
            android:id="@+id/item1"
            android:title="item1">
        </item>
        <item
            android:id="@+id/item2"
            android:title="item2">
        </item>
        <item
            android:id="@+id/item2"
            android:title="item2">
        </item>
    </group>

</menu>


Activity中实例化menu,直接重写Activity的 onCreateOptionsMenu,然后使用 MenuInflater 加载 我们menu目录下的 main.xml 文件作为菜单:
	//创建menu
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater= getMenuInflater();
		inflater.inflate(R.menu.main, menu);
		return true;
	}


监听事件,这就很简单,当某一项被选中时执行,这里通过 item.getItemId() 返回 android:id 来判断是那一项被选中。
	//menu的按键事件
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		int itemId = item.getItemId();
		switch(itemId){
		case R.id.item1:
			showToast("item1");
			break;
		case R.id.item2:
			showToast("item2");
			break;
		case R.id.about:
			showToast("about");
			break;
		case R.id.out:
			finish();
			break;
		}
		return super.onMenuItemSelected(featureId, item);
	}
	
	private void showToast(String content){
		Toast.makeText(mCtx, content, Toast.LENGTH_SHORT).show();
	}




Dialog:

这个实例中有两个Dialog,第一个是系统样式的,第二个使我们添加过view自定义的,其实这里自定义dialog和系统样式的区别在于就是添加了一个View,当然也可以修改Dialog的其他样式,不在这里讲解,我们直接来看自定义的Dialog:

Dialog中添加的View, res/layout/dialog.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" >
    
	<TextView
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="账号:" 
	    />
	<EditText
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:id="@+id/et_username" 
	    android:autoText="true"
	    />
	
	<TextView
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="密码:" 
	    />
	<EditText
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:id="@+id/et_password" 
	    android:autoText="true"
	    />
	
</LinearLayout>



重点来看怎么初始化Dialog的:

LayoutInflater inflater = LayoutInflater.from(mCtx);
View dialogView = inflater.inflate(R.layout.dialog, null);
AlertDialog dlg = new AlertDialog.Builder(mCtx)
	.setTitle("登陆框")
	.setView(dialogView)
	.setPositiveButton("确定", new DialogInterface.OnClickListener() {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			mProgressDialog = new ProgressDialog(mCtx);
			mProgressDialog.setTitle("登陆中");
			mProgressDialog.setMessage("请稍后..");
		        mProgressDialog.setCancelable(true);
			mProgressDialog.show();
			new Thread() {
				@Override
				public void run() {
					try{
						sleep(10000);
					} catch(Exception e){
						e.printStackTrace();
					} finally{
						mProgressDialog.dismiss();
					}
				}
			}.start();
		}
	})
	.setNegativeButton("退出", new DialogInterface.OnClickListener() {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			MainActivity.this.finish();
		}
	})
	.create();
dlg.show();

Inflater 找了一下英文翻译,姑且把它叫做 填充器吧, 我认为Inflater的作用就和他的名字一样,是把 layout, menu 等xml的配置文件填充到 View当中,然后我们再将View显示出来。
LayoutInflater inflater = LayoutInflater.from(mCtx);
View dialogView = inflater.inflate(R.layout.dialog, null);

第一行是构造 LayoutInflater, 然后第二步用 inflater 将 dialog.xml 填充到View中, inflate(R.layout.dialog, null),第二个参数是root,就是我们上一级布局的意思,我们这里传为null。
AlertDialog dlg = new AlertDialog.Builder(mCtx)
	.setTitle("登陆框")
	.setView(dialogView)
	.setPositiveButton("确定", new DialogInterface.OnClickListener() {
		
	})
	.setNegativeButton("退出", new DialogInterface.OnClickListener() {

	})
	.create();

这里我把监听事件的部分删掉了,一目了然,我们使用AlertDialog.Buider 来创建Dialog,当调用create() 方法后,返回值为一个 AlertDialog。里面有一个set方法,就是设置对话框的参数,其中最重要的是 setView() 添加我们自己够着的view。setTitle() 设置对话框的标题, setPositivebutton 和 setNegativeButton 就是添加确定和取消按钮,第二个参数是监听事件:DialogInterface.OnClickListener,点击按钮时触发,很简单。


最后我们看点击事件里面我们做了什么:

			mProgressDialog = new ProgressDialog(mCtx);
			mProgressDialog.setTitle("登陆中");
			mProgressDialog.setMessage("请稍后..");
		        mProgressDialog.setCancelable(true);
			mProgressDialog.show();
			new Thread() {
				@Override
				public void run() {
					try{
						sleep(10000);
					} catch(Exception e){
						e.printStackTrace();
					} finally{
						mProgressDialog.dismiss();
					}
				}
			}.start();

ProgressDialog 是系统内置的带有圆形进度条的对话框,当调用show()方法后会显示在屏幕中间,运行效果参看实例。然后我们启动了一个线 程,sleep(10*1000) 10秒后关掉进图条Dialog。当然在真实开发中应该是做完操作之后,发送消息关闭进度条,以后再做实例。


好了,今天就写到这里!



























来源: <http://write.blog.csdn.net/postedit>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值