前言:这篇是对android相关Dialog的知识进行逐步总结。
1、自定义一个XML布局,这里以登录窗口为例:(activity_log_in.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/log_in_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dip" android:textColor="#000000" android:text="账号登录" android:textStyle="bold" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="fill_parent" android:layout_height="1dip" android:background="#19000000" android:layout_margin="5dip"/> <TextView android:id="@+id/username" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:textColor="#000000" android:text="账号" android:gravity="left" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/txt_username" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:autoText="false" android:capitalize="none" android:gravity="fill_horizontal" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/password" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:textColor="#000000" android:textAppearance="?android:attr/textAppearanceMedium" android:text="密码" android:gravity="left" /> <EditText android:id="@+id/txt_password" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:inputType="textPassword" android:gravity="fill_horizontal" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/txt_toregister" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:textColor="#2200C1" android:textAppearance="?android:attr/textAppearanceMedium" android:text="没有账号?快速注册" android:gravity="left" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/log_in_logIn_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_margin="10dip" android:text="登录"/> <Button android:id="@+id/log_in_try_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_margin="10dip" android:text="试玩"/> </LinearLayout> </LinearLayout>这里要注意两个地方:
(1)、此XML的名字为:activity_log_in.xml
(2)、对总布局进行了ID命名:android:id="@+id/log_in_layout",后面在代码中转换部局时要用到这两个名字,这里先提一下。
2、定义弹出窗体样式
<style name="dialog" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">false</item> <item name="android:windowBackground">@drawable/listbox</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item><!--除去title--> </style>3、代码创建窗体
Dialog mDeleteDialog = new Dialog(getContext(), R.style.dialog); final LayoutInflater inflater = LayoutInflater.from(getContext()); View layout = (LinearLayout) inflater.inflate(R.layout.activity_log_in, null).findViewById(R.id.log_in_layout); mDeleteDialog.setContentView(layout); mDeleteDialog.show(); mDeleteDialog.getWindow().setGravity(Gravity.CENTER);注意一下这里利用已有XML布局创建View的过程。其中R.layout.activity_log_in就是我们的XML布局文件名,R.id.log_in_layout就是XML中的总布局LinearLayout的ID。
android.view.WindowManager$BadTokenException: Unableto add window--tokennullisnotforan application
手册上代码逻辑如下: LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.custom_dialog, (ViewGroup)findViewById(R.id.layout_root)); TextView tv = (TextView)layout.findViewById(R.id.custom_text); tv.setText("Hello, this is a custom dialfo"); ImageView iv = (ImageView)layout.findViewById(R.id.custom_image); iv.setImageResource(R.drawable.icon); builder = new AlertDialog.Builder(getApplicationCOntext()); builder.setView(layout); dialog = builder.create();
将红色标记语句改为builder = new AlertDialog.Builder(Activity.this);
错误原因:
You need to use your Activty as the Context for the Dialog not the Application.
Android is looking for a view to display the Dialog in and the Application does not have one but yourActivity will. The Application is an object which ties your app together and has a Context as it knows about which locale you're running in and so on, but it relies on Activities to display things to the user.
地址:http://blog.csdn.net/sunnyfans/article/details/8094349
Android 如何监听返回键点击事件,并创建一个退出对话框,防止自己写的应用程序不小心点击退出键而直接退出。自己记录下这个简单的demo,备用。
注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉。
源码如下:
public class BackKeyTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK ) { // 创建退出对话框 AlertDialog isExit = new AlertDialog.Builder(this).create(); // 设置对话框标题 isExit.setTitle("系统提示"); // 设置对话框消息 isExit.setMessage("确定要退出吗"); // 添加选择按钮并注册监听 isExit.setButton("确定", listener); isExit.setButton2("取消", listener); // 显示对话框 isExit.show(); } return false; } /**监听对话框里面的button点击事件*/ DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { case AlertDialog.BUTTON_POSITIVE:// "确认"按钮退出程序 finish(); break; case AlertDialog.BUTTON_NEGATIVE:// "取消"第二个按钮取消对话框 break; default: break; } } }; }
小结:
Android手机常用的三个键,home键,back键及menu键。
在应用程序里我们经常会对它们经常进行一定的处理,方便用户使用。
首先我们要明确点击三个键时系统干了什么事,
如果没有进行监听处理,
点击home键时,系统默认只执行应用程序的当前显示的Activity的onStop()方法后跳出界面。
而点击back键时,系统默认执行的是应用程序当前Activity的finish()方法后跳出界面。
而点击menu键时,系统默认不进行任何处理。
这里只是一个简单的应用demo,我们可以根据自己的需要设计一个更完美的退出程序对话框。
也可以在监听到返回事件后进行其他处理,等等。