国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

淺析Android中常見三種彈框在項(xiàng)目中的應(yīng)用

2019-12-12 03:27:10
字體:
供稿:網(wǎng)友

一丶概述

彈框在Android項(xiàng)目中經(jīng)常出現(xiàn),常見的實(shí)現(xiàn)方法有三種:Dialog 彈框,Window彈框,Activity偽彈框。本文就說一說三種彈框的實(shí)現(xiàn)及在項(xiàng)目中的運(yùn)用。

二丶演示圖

       

圖一為常見的三種彈框(文末上鏈接),圖二為項(xiàng)目中用到的Activity偽彈框

三丶正文

1.Dialog彈框

先看一篇一篇文章:

android 8種對話框(Dialog)使用方法匯總

Dialog是系統(tǒng)自帶的彈框,然而常常因?yàn)閁I不好看而遭嫌棄,常需要自定義

public class MyDialog extends Dialog implements android.view.View.OnClickListener {  private Context mContext;  private String mTitle;  private String mDetail;  private TextView mTextTitle;  private TextView mTextDetail;  private TextView mButtonYes;  private TextView mButtonNo;  private onClickInterface mOnclClickInterface;  public MyDialog(Context context, String title, String detail) {    super(context, R.style.MyDialogStyle);    this.mContext = context;    this.mTitle = title;    this.mDetail = detail;  }  @Override  protected void onCreate(Bundle savedInstanceState) {    // TODO Auto-generated method stub    super.onCreate(savedInstanceState);    initView();  }  private void initView() {    LayoutInflater inflater = LayoutInflater.from(mContext);    View view = inflater.inflate(R.layout.layout_dialog, null);    setContentView(view);    mButtonYes = (TextView) view.findViewById(R.id.dialog_yes);    mButtonNo = (TextView) view.findViewById(R.id.dialog_no);    mTextTitle = (TextView) view.findViewById(R.id.dialog_title);    mTextDetail = (TextView) view.findViewById(R.id.dialog_detail);    mTextTitle.setText(mTitle);    mTextDetail.setText(mDetail);    mButtonYes.setOnClickListener(this);    mButtonNo.setOnClickListener(this);  }  public interface onClickInterface {    public void clickYes();    public void clickNo();  }  public void setOnClickInterface(onClickInterface onclClickInterface) {    this.mOnclClickInterface = onclClickInterface;  }  @Override  public void onClick(View v) {    switch (v.getId()) {      case R.id.dialog_yes:        mOnclClickInterface.clickYes();        break;      case R.id.dialog_no:        mOnclClickInterface.clickNo();        break;      default:        break;    }  }}

這里就是:1.綁定布局 2.設(shè)置監(jiān)聽,監(jiān)聽接口

主要說一下布局里的stytle(懸浮在Activity上,模糊顯示就是在這里控制)

<style name="MyDialogStyle">  <item name="android:windowBackground">@android:color/transparent</item> <!--設(shè)置dialog的背景-->  <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框?yàn)闊o-->  <item name="android:windowNoTitle">true</item> <!--是否有title-->  <item name="android:windowIsFloating">true</item> <!--是否浮現(xiàn)在activity之上-->  <item name="android:windowIsTranslucent">false</item> <!--是否半透明-->  <item name="android:windowContentOverlay">@null</item> <!--對話框是否有遮蓋,這個(gè)不設(shè)置的話,可能會出現(xiàn)邊框黑線-->  <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動畫-->  <item name="android:backgroundDimEnabled">true</item> <!-- 背景是否模糊顯示--></style>

Dialog彈框一般用于,網(wǎng)絡(luò)數(shù)據(jù)加載顯示,或交互較少的彈框(基本被新下拉刷新控件SwipeRefreshLayout替代)

2.Window彈框

public class MyWindow {  private Context mContext;  private WindowManager mwinWindowManager;  private View mView;  private static boolean isShow = false;  public MyWindow(Context context) {   mContext = context.getApplicationContext();  }  public void showMyWindow() {   if (isShow) {     return;   }   mwinWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);   //設(shè)置WindowManager.LayoutParams的屬性   WindowManager.LayoutParams params = new WindowManager.LayoutParams();   //類型   params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;   //flags   //如果設(shè)置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View沒焦點(diǎn),收不到Back鍵的事件   //當(dāng)按Back、Home鍵時(shí),背景應(yīng)用退出,彈出的view就可以懸浮在桌面了。   params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;   params.format = PixelFormat.TRANSLUCENT;   params.width = LayoutParams.MATCH_PARENT;   params.height = LayoutParams.MATCH_PARENT;   params.gravity = Gravity.CENTER;   //初始化View   mView = initView(mContext);   //點(diǎn)擊back鍵,關(guān)閉window   mView.setOnKeyListener(new View.OnKeyListener() {     @Override     public boolean onKey(View v, int keyCode, KeyEvent event) {      Log.d("wxx", "onKey");      switch (keyCode) {      case KeyEvent.KEYCODE_BACK:        Log.d("wxx", "onKey BACK");        hideMyWindow();        return true;      default:      return false;      }     }   });   mwinWindowManager.addView(mView, params);   isShow = true;  }  private View initView(Context context) {   LayoutInflater inflater = LayoutInflater.from(context);   View view = inflater.inflate(R.layout.layout_window, null);   Button btnYes = (Button) view.findViewById(R.id.window_yes);   btnYes.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View v) {      Toast.makeText(mContext, "Window yes!", Toast.LENGTH_LONG).show();      hideMyWindow();     }   });   Button btnNO = (Button) view.findViewById(R.id.window_no);   btnNO.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View v) {      Toast.makeText(mContext, "Window No!", Toast.LENGTH_LONG).show();      hideMyWindow();     }   });       //點(diǎn)擊window窗口外圍,關(guān)閉window   final View wView = view.findViewById(R.id.view_layout);   view.setOnTouchListener(new View.OnTouchListener() {     @Override     public boolean onTouch(View v, MotionEvent event) {      int x = (int) event.getX();      int y = (int) event.getY();      Rect rect = new Rect();      wView.getGlobalVisibleRect(rect);      if (!rect.contains(x, y)) {        hideMyWindow();      }      return false;     }   });   return view;  }  public void hideMyWindow() {   if (isShow && mView != null) {     mwinWindowManager.removeView(mView);     isShow = false;   }  }}

這個(gè)就厲害了,展現(xiàn),隱藏,點(diǎn)擊監(jiān)聽都是自己寫的方法,原來點(diǎn)擊窗口外關(guān)閉窗口是這樣實(shí)現(xiàn)的,是不是又學(xué)到了

然后是關(guān)于:

android Window WindowManager 整理

主要用于自定義控件,比如說下拉框:

自定義spinner下拉框

3.Activity偽彈框

public class MyActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {   // TODO Auto-generated method stub   super.onCreate(savedInstanceState);   setContentView(R.layout.layout_activity);  }  @Override  public boolean onTouchEvent(MotionEvent event) {   this.finish();   return true;  }  public void YesButton(View v) {   this.finish();   Toast.makeText(getApplicationContext(), "Yes, Hunman is Activity", Toast.LENGTH_LONG).show();  }  public void NoButton(View v) {   this.finish();   Toast.makeText(getApplicationContext(), "No, Hunman is not Activity", Toast.LENGTH_LONG).show();  }}

簡單得不能再簡單,跳轉(zhuǎn)跳轉(zhuǎn)到另一個(gè)Activity

注意點(diǎn)Activity主題(控制Activity為彈框樣式):

<activity  android:name="com.wuxianxi.hunman.smallwindows.MyActivity"  android:theme="@style/MyActivityStyle" ></activity><style name="MyActivityStyle">  <item name="android:windowBackground">@android:color/transparent</item> <!--設(shè)置dialog的背景-->  <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框?yàn)闊o-->  <item name="android:windowNoTitle">true</item> <!--是否有title-->  <item name="android:windowIsFloating">true</item> <!--是否浮現(xiàn)在activity之上-->  <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->  <item name="android:windowContentOverlay">@null</item> <!--對話框是否有遮蓋,這個(gè)不設(shè)置的話,可能會出現(xiàn)邊框黑線-->  <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動畫-->  <item name="android:backgroundDimEnabled">true</item> <!-- 背景是否模糊顯示--></style>

Activity偽彈框最常用,用于交互,操作較復(fù)雜的彈框,如圖二

補(bǔ)充這里可通過方法控制Activity彈框?qū)挶?/p>

 @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    /** 設(shè)置寬度為屏幕的0.9*/    WindowManager windowManager = getWindowManager();    /* 獲取屏幕寬、高 */    Display display = windowManager.getDefaultDisplay();    /* 獲取對話框當(dāng)前的參數(shù)值 */    WindowManager.LayoutParams p = getWindow().getAttributes();    /* 寬度設(shè)置為屏幕的0.9 */    p.width = (int) (display.getWidth() * 0.9);    /* 設(shè)置透明度,0.0為完全透明,1.0為完全不透明 */    p.alpha = 0.95f;    /* 設(shè)置布局參數(shù) */    getWindow().setAttributes(p);//    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,//        ViewGroup.LayoutParams.WRAP_CONTENT);    /* 設(shè)置點(diǎn)擊彈框外部不可消失 */    setFinishOnTouchOutside(false);  }

最后貼上MainActivity

public class MainActivity extends ActionBarActivity implements OnClickListener {  private Button btnWindow;  private Button btnDialog;  private Button btnActivity;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   initView();  }  private void initView() {   btnWindow = (Button) findViewById(R.id.btn_window);   btnDialog = (Button) findViewById(R.id.btn_dialog);   btnActivity = (Button) findViewById(R.id.btn_activity);   btnWindow.setOnClickListener(this);   btnDialog.setOnClickListener(this);   btnActivity.setOnClickListener(this);  }  @Override  public void onClick(View v) {   switch (v.getId()) {   case R.id.btn_window:     MyWindow myWindow = new MyWindow(this);     myWindow.showMyWindow();     break;   case R.id.btn_dialog:     //注意下面第一個(gè)參數(shù)不能為getApplicationContext(),而應(yīng)該是Activity, 因?yàn)檗k有activity才能添加窗口     final MyDialog dialog = new MyDialog(MainActivity.this, "Hunman - Dialog", "Hunman is a Dialog/nYes or No!");     dialog.show();     dialog.setOnClickInterface(new MyDialog.onClickInterface() {      @Override      public void clickYes() {        dialog.dismiss();        Toast.makeText(getApplicationContext(), "Yes, Hunman is Dialog", Toast.LENGTH_LONG).show();      }      @Override      public void clickNo() {        dialog.dismiss();        Toast.makeText(getApplicationContext(), "Yes, Hunman is not Dialog", Toast.LENGTH_LONG).show();      }     });     break;   case R.id.btn_activity:     Intent intent3 = new Intent(MainActivity.this, MyActivity.class);     startActivity(intent3);     break;   default:     break;   }  }}

代碼下載地址:https://github.com/BabyWu/SmallWindows

以上所述是小編給大家介紹的淺析Android中常見三種彈框在項(xiàng)目中的應(yīng)用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 叙永县| 岚皋县| 报价| 鲁山县| 渝北区| 金湖县| 灵台县| 安多县| 廊坊市| 富锦市| 泗水县| 宁夏| 南安市| 金阳县| 渭源县| 茂名市| 清水河县| 区。| 长葛市| 内江市| 康平县| 易门县| 萝北县| 防城港市| 平谷区| 新巴尔虎右旗| 长泰县| 陆河县| 综艺| 台江县| 柯坪县| 黔西| 安多县| 利津县| 巴林左旗| 平顶山市| 健康| 海丰县| 海丰县| 大余县| 大余县|