底部弹窗是我Android李一个比较多的应用啦,自定义的流程就不说啦,资料很多。直接贴代码。这里记录一下减少开发成本:
1.自定义一个dialog:
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
import creativity.intelligence.software.sidus.link.R;
/**
* Created by ${asy} on 2018/12/19.
* https://blog.csdn.net/qXing123456789/article/details/83272671
* G:\Wader\KxBottomDialog
*/
public class BottomCirTraDialogNo extends Dialog /*implements AdapterView.OnItemClickListener*/ {
private List<String> mList;
private SelectDialogListener mListener;
private Activity mActivity;
private boolean mUseCustomColor = false;
private int mFirstItemColor;
private int mOtherItemColor;
private Button mBtnCancel, btnBack, btnChoice;
private int location;
private SelectDialogCancelListener mCancelListener;
public DialogAdapter dialogAdapter;
private Window window;
private Context context;
public BottomCirTraDialogNo(@NonNull Context context) {
super(context);
}
public BottomCirTraDialogNo(Activity activity, int theme, SelectDialogListener listener, List<String> names) {
super(activity, theme);
mActivity = activity;
mListener = listener;
mList = names;
this.window = getWindow();
// setLightNavigationBar();
// hideBottomUIMenu();
// window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//点击Dialog外部消失
setCanceledOnTouchOutside(true);
}
public interface SelectDialogCancelListener {
void onCancelClick(View v);
}
public interface SelectDialogListener {
void onItemClick(AdapterView<?> parent, View view, int position, long id, Button btn, TextView itemText);
}
private void hideBottomUIMenu() {
//隐藏虚拟按键,并且全屏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//for new api versions.
// View decorView = getWindow().getDecorView();
// int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
// | View.SYSTEM_UI_FLAG_IMMERSIVE;
// decorView.setSystemUiVisibility(uiOptions);
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
@SuppressLint("InlinedApi")
private void setLightNavigationBar() {
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setNavigationBarColor(mActivity.getResources().getColor(R.color.color_ff3a3a3a)); //#fafafa
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setNavigationBarColor(ContextCompat.getColor(mActivity, R.color.color_ff3a3a3a));
}
View view;
if (mList.get(0).equals(getContext().getResources().getString(R.string.Settings_signout_confirm))) {
view = getLayoutInflater().inflate(R.layout.dialog_exam_type_login_out, null);
} else {
view = getLayoutInflater().inflate(R.layout.dialog_exam_type, null);
}
setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Window window = getWindow();
//设置动画
window.setWindowAnimations(R.style.main_menu_animstyle);
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.x = 0;
attributes.y = mActivity.getWindowManager().getDefaultDisplay().getHeight();
//保证按钮水平满屏
attributes.width = ViewGroup.LayoutParams.MATCH_PARENT;
attributes.height = ViewGroup.LayoutParams.WRAP_CONTENT;
//设置显示位置
onWindowAttributesChanged(attributes);
initView();
}
@SuppressLint("ResourceAsColor")
private void initView() {
dialogAdapter = new DialogAdapter(mList);
ListView listView = (ListView) findViewById(R.id.dialog_list);
mBtnCancel = (Button) findViewById(R.id.btn_cancel);
btnBack = (Button) findViewById(R.id.btnBack);
btnChoice = (Button) findViewById(R.id.btnChoice);
// listView.setOnItemClickListener(this);
listView.setAdapter(dialogAdapter);
mBtnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCancelListener != null) {
mCancelListener.onCancelClick(v);
}
dismiss();
}
});
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCancelListener != null) {
mCancelListener.onCancelClick(v);
}
dismiss();
}
});
btnChoice.setVisibility(View.GONE);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.v("aaaa", "click");
dialogAdapter.setCurrentItem(position);
dialogAdapter.setClick(true);
mListener.onItemClick(parent, view, position, id, btnChoice, dialogAdapter.viewholder.dialogItemButton);
dialogAdapter.notifyDataSetChanged();
dismiss();
}
});
}
private class DialogAdapter extends BaseAdapter {
private List<String> mStrings;
public Viewholder viewholder;
private LayoutInflater layoutInflater;
private int mCurrentItem = 0;
private boolean isClick = false;
public DialogAdapter(List<String> strings) {
this.mStrings = strings;
this.layoutInflater = mActivity.getLayoutInflater();
}
@Override
public int getCount() {
return mStrings.size();
}
@Override
public Object getItem(int position) {
return mStrings.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
viewholder = new Viewholder();
convertView = layoutInflater.inflate(R.layout.view_dialog_item, null);
viewholder.dialogItemButton = (TextView) convertView.findViewById(R.id.dialog_item_bt);
viewholder.mRelativeLayout = (RelativeLayout) convertView.findViewById(R.id.rlItem);
convertView.setTag(viewholder);
} else {
viewholder = (Viewholder) convertView.getTag();
}
viewholder.dialogItemButton.setText(mStrings.get(position));
viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_2));
viewholder.dialogItemButton.setEnabled(true);
//已经获取过协作码
if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_code_in_menu)) && SaveDataUtils.getData("currentTime", 0) != null && (int) SaveDataUtils.getData("currentTime", 0) != 0) {
viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
viewholder.dialogItemButton.setEnabled(false);
}
//已经添加两个成员
if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_code_in_menu)) && SaveDataUtils.getData("isHaveTwo", false) != null && (boolean) SaveDataUtils.getData("isHaveTwo", false)){
Log.v("geno","获取协作码" + position);
viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
viewholder.dialogItemButton.setEnabled(false);
}
//已经添加两个成员
if (mStrings.get(position).equals(mActivity.getResources().getString(R.string.group_created_add_in_menu)) && SaveDataUtils.getData("isHaveTwo", false) != null && (boolean) SaveDataUtils.getData("isHaveTwo", false)) {
Log.v("geno","添加协作成员" + position);
viewholder.dialogItemButton.setTextColor(mActivity.getResources().getColor(R.color.textcolor_4));
viewholder.dialogItemButton.setEnabled(false);
}
if (!mUseCustomColor) {
mFirstItemColor = mActivity.getResources().getColor(R.color.itemtextcolor);
// mOtherItemColor = mActivity.getResources().getColor(R.color.textColor);
}
viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_center);
return convertView;
}
public void setCurrentItem(int currentItem) {
this.mCurrentItem = currentItem;
}
public void setClick(boolean click) {
this.isClick = click;
}
}
public static class Viewholder {
public TextView dialogItemButton;
private RelativeLayout mRelativeLayout;
}
/* @Override
public void show() {
ToolUtils.focusNotAle(window);
super.show();
ToolUtils.hideNavigationBar(window);
ToolUtils.clearFocusNotAle(window);
}*/
}
2.建立一个布局工dialog加载:
<?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:background="@drawable/shape_bootom_no_config"
android:gravity="bottom"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rlBack"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btnBack"
android:layout_width="40dp"
android:layout_height="4dp"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_20"
android:layout_centerHorizontal="true"
android:background="@drawable/shape_button_green" />
<Button
android:visibility="gone"
android:id="@+id/btnChoice"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="32dp"
android:background="@null"
android:textSize="16sp"
android:text="@string/general_action_confirm"
android:textColor="@color/green"
android:textAllCaps="false"/>
<TextView
android:layout_below="@+id/btnBack"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginEnd="@dimen/dp_50"
android:gravity="center_horizontal"
android:text="@string/Settings_signout_tips"
android:textSize="@dimen/sp_16"
android:textColor="@color/green"/>
</RelativeLayout>
<ListView
android:id="@+id/dialog_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_8"
android:divider="@drawable/main_list_divider_line"
android:cacheColorHint="@android:color/transparent"
android:dividerHeight="0.5dp"
android:listSelector="@android:color/transparent" />
<!-- android:divider="#DAD9DB"item分割綫顔色-->
<Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dip"
android:background="@drawable/dialog_item_bg_only"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#0073FF"
android:textSize="18sp"
android:visibility="gone" />
</LinearLayout>
<?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">
<LinearLayout
android:background="@drawable/shape_bootom_no_config"
android:gravity="bottom"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rlBack"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="@dimen/dp_7"
>
<Button
android:id="@+id/btnBack"
android:layout_width="40dp"
android:layout_height="4dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@drawable/shape_button_green" />
<Button
android:visibility="gone"
android:id="@+id/btnChoice"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:gravity="right|center_vertical"
android:layout_marginEnd="@dimen/dp_37"
android:background="@null"
android:textSize="16sp"
android:text="@string/general_action_confirm"
android:textColor="@color/green"
android:textAllCaps="false"/>
</RelativeLayout>
<ListView
android:id="@+id/dialog_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_8"
android:divider="@drawable/main_list_divider_line"
android:cacheColorHint="@android:color/transparent"
android:dividerHeight="0.5dp"
android:listSelector="@android:color/transparent" />
<!-- android:divider="#DAD9DB"item分割綫顔色-->
<Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dip"
android:background="@drawable/dialog_item_bg_only"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#0073FF"
android:textSize="18sp"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
最后就是在Activity中调用啦:
private BottomCirTraDialogNo dialog;
/**
* 底部列表弹窗
*/
private void groupListView(final List<String> name) {
showDialog((parent, view, position, id, btn, itemText) -> {
itemText.setTextColor(getResources().getColor(R.color.green));
switch (position) {
case 0:
clearAppFile();
clearDb();
ActivityMangerUtil.getInstance().OutSign();
Intent intent = new Intent(SettingActivity.this, HomeActivity.class);
startActivity(intent);
new Thread(new Runnable() {
@Override
public void run() {
PersonalManger.questyLoginOut(mMyOkhttp, UrlConfig.USER_LONIN_OUT);
}
}).start();
break;
case 1://取消
break;
}
dialog.dismiss();
}, name);
}
private void showDialog(BottomCirTraDialogNo.SelectDialogListener listener, List<String> names) {
dialog = new BottomCirTraDialogNo(getActivity(), R.style.transparentFrameWindowStyle, listener, names);
if (!getActivity().isFinishing()) {
dialog.show();
}
}