安卓-三種類型的彈出框
阿新 • • 發佈:2018-11-14
安卓-三種類型的彈出框
做安卓開發以來,大體用過三種形式的彈出框,實現的效果差不多,只是資料處理的方式不同,根據不同的需求選擇合適的彈出框,樣式要根據自己的需求更改。
- 第一種:安卓自帶AlertDialog
- 第二種:popwindow
- 第三種:activity型別自定義的彈出框
來看下效果圖
第一種:安卓自帶AlertDialog
第一種比較簡單,程式碼量很少,鑑於現在安卓版本的提升,自帶的很多控制元件的樣式其實也並不難看,只要不是特殊的需求,一般可以直接使用,這個不多說,下面是一個適用於ListView的彈出框。
程式碼
直接寫成一個方法,引數可以自己定義,因為可能一個頁面會用到多個dialog,這裡傳入的是一個動態的list,也可以直接扔過去一個數組。
private void selectTypeDiag(final List<String> list) {
int len=list.size();
final String items[]=new String[len];//不能直接用list.size,會出錯
for (int i=0;i<list.size();i++){
items[i]=list.get(i);
}
//dialog引數設定
AlertDialog.Builder builder = new AlertDialog.Builder(this); //先得到構造器
builder.setTitle("請選擇"); //設定標題
//builder.setMessage("是否確認退出?"); //設定內容
//builder.setIcon(R.mipmap.ic_launcher);//設定圖示,圖片id即可
//設定列表顯示,注意設定了列表顯示就不要設定builder.setMessage()了,否則列表不起作用。
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
tv_text.setText(items[which]);
}
});
builder.create();
builder.create().show();
}
第二種:popwindow
popwindow與第一種相比靈活性比較大,可以自定義佈局檔案,可以新增動畫,自定義彈出方位。
程式碼
一、首先定義一個popwindow,layout和動畫可以自己定義,程式碼裡都有註釋。
public class PopShowView extends PopupWindow {
private LayoutInflater layoutInflater;
private View popView;
private List<String> infoList;
private ListView lv_leavetype;
private PopShowAdapter popLeaveTypeAdapter;
private Context context;
private LinearLayout pop_layout;
private PopLeaveTypeListener popLeaveTypeListener;
public PopShowView(Context context, List<String> infoList) {
this.layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
this.infoList = infoList;
init();
}
private void init() {
popView = layoutInflater.inflate(R.layout.pop_window_leavetype, null);
lv_leavetype = (ListView) popView.findViewById(R.id.lv_leavetype);
pop_layout = (LinearLayout) popView.findViewById(R.id.pop_layout);
if (infoList != null) {
popLeaveTypeAdapter = new PopShowAdapter(context, infoList);
lv_leavetype.setAdapter(popLeaveTypeAdapter);
lv_leavetype.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (popLeaveTypeListener != null) {
popLeaveTypeListener.clickData(infoList.get(position));
}
dismiss();
}
});
}
//把View新增到PopWindow中
this.setContentView(popView);
//設定SelectPicPopupWindow彈出窗體的寬
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
//設定SelectPicPopupWindow彈出窗體的高
this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
//設定SelectPicPopupWindow彈出窗體可點選
this.setFocusable(true);
//設定SelectPicPopupWindow彈出窗體動畫效果
this.setAnimationStyle(R.style.BottomPopWindowAnimation);
// this.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//例項化一個ColorDrawable顏色為透明
//例項化一個ColorDrawable顏色為半透明
ColorDrawable dw = new ColorDrawable(0x6f000000);
//設定SelectPicPopupWindow彈出窗體的背景
this.setBackgroundDrawable(dw);
popView.setOnTouchListener(new View.OnTouchListener() {//設定背景區域外為點選消失popwindow
public boolean onTouch(View v, MotionEvent event) {
int height = popView.findViewById(R.id.pop_layout).getTop();
int y = (int) event.getY();
if (event.getAction() == MotionEvent.ACTION_UP) {
if (y < height) {
dismiss();
}
}
return true;
}
});
}
public void setClickDataListener(PopLeaveTypeListener popLeaveTypeListener) {
this.popLeaveTypeListener = popLeaveTypeListener;
}
// @Override
// public void onClick(View arg0) {
// switch (arg0.getId()) {
// case R.id.iv_close_pop:
// dismiss();
// break;
// default:break;
// }
// }
}
二、因為要新增點選事件,並且需要在activity裡面獲取到list裡面的資料,所以還要在寫一個監聽器PopLeaveTypeListener 。
/**
* Created by Daxue on 2016/12/2.
*/
public interface PopLeaveTypeListener {
void clickData(String data);//資料型別根據自己list的型別定義
}
三、下面是activity裡面TextView的點選事件。
case R.id.tv_thetwo:
PopShowView popshow = new PopShowView(this, mData);
if (popshow.isShowing()) {
popshow.dismiss();
} else {
// myPopWindowBottomShow.showAsDropDown(bottom_popwindow);//popwindow放在子控制元件bottom_popwindow下面Ps:如果手機有虛擬按鍵的話popwindow將顯示不完全
popshow.showAtLocation(this.findViewById(R.id.activity_main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);//這種方式無論有虛擬按鍵還是沒有都可完全顯示,因為它顯示的在整個父佈局中
}
popshow.setClickDataListener(new PopLeaveTypeListener() {
@Override
public void clickData(String data) {
// Toast.makeText(getContext(),
// year + "-" + month + "-" + day, Toast.LENGTH_SHORT).show();
// setAddPopwindowShowData(day,month,year);
tv_thetwo.setText(data + "");
}
});
break;
第三種:activity型別的dialog
一、首先定義activity的主題theme
<style name="Dialog" parent="android:style/Theme.Dialog">
<item name="android:background">#00000000</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
</style>
二、DialogActivity
public class DialogActivity extends Activity implements
View.OnClickListener {
private static final String TAG="DialogActivity";
private TextView tv_remark,tv_submit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signalertdialog);
//定義彈出框,防止彈出框的高度和寬度變形
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay();//為獲取螢幕寬、高
WindowManager.LayoutParams p = getWindow().getAttributes();//獲取對話方塊當前的引數值
p.height = (int) (d.getHeight() * 1.0);//高度設定為螢幕的1.0
p.width = (int) (d.getWidth() * 1.0); //寬度設定為螢幕的1.0
//p.alpha = 1.0f;//設定本身透明度
p.dimAmount = 0.8f; //設定黑暗度
getWindow().setAttributes(p);//設定生效
initView();
initListener();
}
private void initView() {
tv_submit= (TextView) findViewById(R.id.tv_submit);
}
private void initListener() {
tv_submit.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_submit:
Intent mIntent = new Intent();
mIntent.putExtra("submit","submit");
// 設定結果,並進行傳送
setResult(2, mIntent);
finish();
break;
default:
break;
}
}
三、在AndroidManifest裡面註冊activity
<activity android:name=".DialogActivity"
android:theme="@style/Dialog"/>
四、在activity裡面寫監聽事件
//textview的點選事件
case R.id.tv_three:
Intent intent = new Intent(this, DialogActivity.class);
startActivityForResult(intent, 2);
break;
//dialog activity的返回的結果處理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 2) {
if (data != null) {
tv_thethree.setText(data.getStringExtra("submit"));
} else {
tv_thethree.setText("第三種:Activity Dialog");
}
}
}