Back键和Menu键程序退出弹窗以及按钮退出程序弹窗的实现

MainActivity.java

package com.loaderman.backmenudemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {
    private boolean menu_display = false;
    private PopupWindow    menuWindow;
    private LayoutInflater inflater;
    private View         layout;
    private LinearLayout mClose;
    private LinearLayout mCloseBtn;
    public static MainActivity instance = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance=this;
    }
     public void exit(View view ){
         Intent intent = new Intent();
         intent.setClass(MainActivity.this,ExitFromSettings.class);
         startActivity(intent);
     }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {  //获取 back键
            System.out.println(2);
            if (menu_display) {
                System.out.println(3);//如果 Menu已经打开 ,先关闭Menu
                menuWindow.dismiss();
                menu_display = false;
            } else {
                System.out.println(4);
                Intent intent = new Intent();
                intent.setClass(this, Exit.class);
                startActivity(intent);
            }
        } else if (keyCode == KeyEvent.KEYCODE_MENU) {   //获取 Menu键
            if(!menu_display){
                //获取LayoutInflater实例
                inflater =     (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
                //这里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
                //该方法返回的是一个View的对象,是布局中的根
                layout = inflater.inflate(R.layout.main_menu, null);

                //下面我们要考虑了,我怎样将我的layout加入到PopupWindow中呢???很简单
                menuWindow = new PopupWindow(layout, RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); //后两个参数是width和height
                //menuWindow.showAsDropDown(layout); //设置弹出效果
                //menuWindow.showAsDropDown(null, 0, layout.getHeight());
                menuWindow.showAtLocation(this.findViewById(R.id.activity_main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
                //如何获取我们main中的控件呢?也很简单
                mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
                mCloseBtn = (LinearLayout)layout.findViewById(R.id.menu_close_btn);

                //下面对每一个Layout进行单击事件的注册吧。。。
                //比如单击某个MenuItem的时候,他的背景色改变
                //事先准备好一些背景图片或者颜色
                mCloseBtn.setOnClickListener (new View.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                        //Toast.makeText(Main.this, "退出", Toast.LENGTH_LONG).show();
                        Intent intent = new Intent();
                        intent.setClass(MainActivity.this,Exit.class);
                        startActivity(intent);
                        menuWindow.dismiss(); //响应点击事件之后关闭Menu
                    }
                });
                menu_display = true;
            }else{
                //如果当前已经为显示状态,则隐藏起来
                menuWindow.dismiss();
                menu_display = false;
            }

            return false;
        }
        return false;
    }
}

ExitFromSettings.java

package com.loaderman.backmenudemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class ExitFromSettings extends Activity {
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exit_from_settings);
        layout=(LinearLayout)findViewById(R.id.exit_layout2);
        layout.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
    @Override
    public boolean onTouchEvent(MotionEvent event){
        finish();
        return true;
    }

    public void exitbutton1(View v) {
        this.finish();
    }
    public void exitbutton0(View v) {
        this.finish();
        MainActivity.instance.finish();//关闭Main 这个Activity
    }
}

Exit.java

package com.loaderman.backmenudemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class Exit extends Activity {
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.exit_dialog);
        layout=(LinearLayout)findViewById(R.id.exit_layout);
        layout.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
    @Override
    public boolean onTouchEvent(MotionEvent event){
        finish();
        return true;
    }

    public void exitbutton1(View v) {
        this.finish();
    }
    public void exitbutton0(View v) {
        this.finish();
        MainActivity.instance.finish();//关闭Main 这个Activity
    }
}

在res/anim文件下创建滑入退出动画

push_bottom_in.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="50%p" />
</set>

push_bottom_out.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="50%p" />
</set>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    tools:context="com.loaderman.backmenudemo.MainActivity">

    <Button
        android:onClick="exit"
        android:textSize="18sp"
        android:textColor="#fff"
        android:textStyle="bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_style_alert_dialog_special"
        android:text="退出程序"/>
</RelativeLayout>

activity_exit_from_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_exit_from_settings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_horizontal"
        >

        <LinearLayout
            android:id="@+id/exit_layout2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:layout_gravity="bottom"
            android:orientation="vertical"
            android:background="@drawable/exit_dialog_bg" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:gravity="center"
                android:textColor="#fff"
                android:textSize="16sp"
                android:text="退出后不会删除任何历史数据,下次\n登录依然可以使用本帐号" />
            <Button
                android:id="@+id/exitBtn0"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="退出登录"
                android:textSize="18sp"
                android:textColor="#fff"
                android:layout_marginTop="15dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:background="@drawable/btn_style_alert_dialog_special"
                android:gravity="center"
                android:onClick="exitbutton0"
                />
            <Button
                android:id="@+id/exitBtn1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="10dp"
                android:text="取消"
                android:textSize="18sp"
                android:textColor="#fff"
                android:background="@drawable/btn_style_alert_dialog_cancel"
                android:gravity="center"
                android:onClick="exitbutton1"
                />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

exit_dialog.xml

<?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/exit_layout"
        android:layout_width="280dp"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:background="@drawable/confirm_dialog_bg2" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:padding="5dp"
            android:textColor="#333"
            android:textSize="20sp"
            android:text="退出微信" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#333"
            android:layout_marginTop="1dp"
            android:padding="10dp"
            android:textSize="16sp"
            android:gravity="center_horizontal"
            android:text="退出后,你将收不到新的消\n息.确定要退出?" /> 

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="33dp"
            android:layout_marginBottom="8dp"
             >

            <Button
              android:id="@+id/exitBtn0"
              android:layout_width="110dp"
              android:layout_height="wrap_content"
              android:text="是"
              android:textSize="16sp"
              android:textColor="#fff"
              android:background="@drawable/btn_style_green"
              android:gravity="center"
           android:onClick="exitbutton0"
              />

            <Button
              android:id="@+id/exitBtn1"
              android:layout_width="110dp"
              android:layout_height="wrap_content"
              android:layout_marginLeft="10dp"
              android:text="否"
              android:textSize="16sp"
              android:textColor="#333"
              android:background="@drawable/btn_style_white"
              android:gravity="center"
           android:onClick="exitbutton1"
              />
        </LinearLayout>
    </LinearLayout>

main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 

    >

    <LinearLayout
        android:id="@+id/menu_close"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:gravity="center"
       android:background="@drawable/menu_bg"
         >

        <LinearLayout
           android:id="@+id/menu_close_btn"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical"
          android:gravity="center"
          android:background="@drawable/menu_btn_bg"
          >

       <ImageView
           android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/btn_close" />

       <TextView
           android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="退出"
          android:textColor="#eee"/>
      </LinearLayout>
    </LinearLayout>
</LinearLayout>

给退出的Activity设置Style

<style name="MyDialogStyle">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:backgroundDimEnabled">true</item>
</style>
<style name="MyDialogStyleBottom" parent="android:Theme.Dialog" >
    <item name="android:windowAnimationStyle">@style/AnimBottom</item>
    <item name="android:windowFrame">@null</item><!--边框-->
    <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
    <item name="android:windowIsTranslucent">true</item><!--半透明-->
    <item name="android:windowNoTitle">true</item><!--无标题-->
    <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
    <item name="android:backgroundDimEnabled">true</item><!--模糊-->
</style>
<style name="AnimBottom" parent="@android:style/Animation">
    <item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
    <item name="android:windowExitAnimation">@anim/push_bottom_out</item>
</style>

在清单文件中设置:

<activity android:name=".Exit"
  android:theme="@style/MyDialogStyle"/>
<activity android:name=".ExitFromSettings"
  android:theme="@style/MyDialogStyleBottom"/>

效果图:

 
时间: 2024-10-14 19:23:30

Back键和Menu键程序退出弹窗以及按钮退出程序弹窗的实现的相关文章

屏蔽掉返回键,menu键,Home键

public class LockActivity extends Activity{ private static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.getW

Atitit.android js 的键盘按键检测Back键Home键和Menu键事件

1. onKeyDown @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // 在这里做你想做的事情 // super.openOptionsMenu();  // 调用这个,就可以弹出菜单 webView.loadUrl("javascript:KEYCODE_MENU_handle()"); } return true;

[转]Android 如何监听返回键,弹出一个退出对话框

本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉. 源码如下: [html] view plaincopyprint? public class BackKeyTest extends Activi

Android 如何监听返回键,弹出一个退出对话框

Android 如何监听返回键,弹出一个退出对话框 分类: 初级android2012-10-21 00:46 48472人阅读 评论(9) 收藏 举报 androiddialogbuttonclass Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉. 源码如下: [html] view plaincopy <EM

返回键捕获 应用程序退出的两种方式(转)

作为应用程序一个较好的用户体验应该是:在退出应用程序前询问用户是否真正退出?目前普遍做法是,一在退出前询问是否真正退出,二是连续按两下退出. 返回键捕获 应用程序退出的两种方式 实现上述两种应用退出方式需要在onkeyDown()来进行捕获返回键 在Activity中,如果需要动态注册广播官方文档建议在onResume()进行注册,在onPause()中取消注册.注册部分代码如下: 应用程序退出方式一:确认退出对话框 public boolean onKeyDown(int keyCode, K

安卓Menu键的问题

近期开发中有须要Menu键,结果发现了一个非常尴尬的问题.我的測试机上有Menu键.可是測试平板上没有,队友的測试机上竟然也没有Menu键.这着实有些尴尬... 上网谷歌之后才发现问题所在: 仅仅有在android 4.0 之前的机器中,menu 键是才作为硬件存在的,之后的机器有的有.有的就没有了,比方三星的S3,Note2等等都是有这个按键的.可是很多其它的手机取消了这个按键.所以假设project中实用到这个按键,那就必须调低最低版本号, 比方android 2.2 的project,跑到

去掉标题栏/ActionBar后点击menu键时应用崩溃

MainActivity 继承了 ActionBarActivity后,想要去掉标题栏(ActionBar),在程序中加上requestWindowFeature(Window.FEATURE_NO_TITLE);,结果标题栏是去掉了,但是在点击Menu键时应用会崩溃.在网上找了一下解决方法,都是把MainActivity继承ActionBarActivity改为继承Activity,这样虽然能够解决问题,但是如果一定是要继承ActionBarActivity不能改的话要怎么办呢?例如在我的程序

禁用menu键

发现很多应用中基本不再使用menu键来显示菜单了,而在android studio中创建一个activity时,默认使用了actionBar,就是在右上角会显示三个点的内容,点击会出现Settings,当点击menu键时,在屏幕下方也会出现Settings菜单.如何禁用menu呢,重写onKeyDown方法即可.直接看代码 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 if(keyCode == K

android部分机型(HTC D610) menu键的显示问题

今天遇到了一个很恶心的问题... htc某些机器的menu键是在屏幕里的,可以由系统控制显示和隐藏.今天遇到了一个问题,有两个应用,一个运行后显示menu键,另一个不显示... 找了好一会儿,发现是 android:targetSdkVersion="18"的问题 最终sdk build version 19(4.4.2),minSdkVersion = "8",不指定targetSdkVersion.就都显示了... android部分机型(HTC D610) m