package com.loaderman.addressdialogdemo; import android.app.Dialog; import android.content.Context; import android.view.Gravity; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; /** * * <p/> * 自定义归属地风格弹窗 * <p/> * 1. 给dialog设置布局,setContentView * 2. 去掉标题栏和背景 * 去掉标题栏 * <item name="android:windowNoTitle">true</item> * 去掉背景 * <item name="android:windowBackground">@color/white</item> * <p/> * 3. dialog显示在屏幕下方, 修改窗口的位置 */ public class AddressDialog extends Dialog { private ListView lvList; public AddressDialog(Context context) { //指定dialog的样式 super(context, R.style.AddressDialogStyle); //给dialog设置布局 setContentView(R.layout.dialog_address); //显示在屏幕正下方 //原理: 修改dialog所在窗口Window的位置, dialog随窗口显示 Window window = getWindow();//获取dialog所在的窗口对象 WindowManager.LayoutParams attributes = window.getAttributes();//获取当前窗口的属性(布局参数) attributes.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;//靠下居中显示 window.setAttributes(attributes);//重新设置布局参数 lvList = (ListView) findViewById(R.id.lv_list); } //为了增强扩展性, 可以由外部传递adapter进来, 决定ListView的显示内容 public void setAdapter(BaseAdapter adapter) { lvList.setAdapter(adapter); } //设置条目点击事件 public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { lvList.setOnItemClickListener(listener); } }
package com.loaderman.addressdialogdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private int[] mIcons = new int[]{R.drawable.shape_address_normal, R.drawable .shape_address_orange, R.drawable.shape_address_blue, R.drawable.shape_address_gray, R.drawable.shape_address_green}; private String[] mNames = new String[]{"半透明", "活力橙", "卫士蓝", "金属灰", "苹果绿"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void set(View view) { //显示弹窗 //dialog中传的context必须是activity对象 final AddressDialog dialog = new AddressDialog(MainActivity.this); dialog.setAdapter(new AddressStyleAdapter()); dialog.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //1. 记录当前被选中的条目的位置, 保存在sp中 PrefUtils.putInt(getApplicationContext(), "address_style", position); //2. 隐藏弹窗 dialog.dismiss(); } }); dialog.show(); } //归属地样式弹窗adapter class AddressStyleAdapter extends BaseAdapter { @Override public int getCount() { return mNames.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(MainActivity.this, R.layout.item_address, null); ImageView ivIcon = (ImageView) view.findViewById(R.id.iv_icon); TextView tvName = (TextView) view.findViewById(R.id.tv_name); ImageView ivSelect = (ImageView) view.findViewById(R.id.iv_select); ivIcon.setImageResource(mIcons[position]); tvName.setText(mNames[position]); //从sp中取出当前选中的样式位置 //和当前position比较 int pos = PrefUtils.getInt(getApplicationContext(),"address_style", 0);//默认是半透明 if (position == pos) { //当前条目被选中 //显示勾选图片 ivSelect.setVisibility(View.VISIBLE); } else { ivSelect.setVisibility(View.GONE); } return view; } } }
package com.loaderman.addressdialogdemo; import android.content.Context; import android.content.SharedPreferences; public class PrefUtils { public static void putInt(Context ctx, String key, int value) { SharedPreferences sp = ctx.getSharedPreferences("config", Context.MODE_PRIVATE); sp.edit().putInt(key, value).commit(); } public static int getInt(Context ctx, String key, int defValue) { SharedPreferences sp = ctx.getSharedPreferences("config", Context.MODE_PRIVATE); return sp.getInt(key, defValue); } }
在res/anim下
<!--anim_dialog_enter--> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <alpha android:duration="@integer/abc_config_activityShortDur" android:fromAlpha="0.0" android:interpolator="@android:anim/decelerate_interpolator" android:toAlpha="1.0"/> <translate android:duration="150" android:fromYDelta="70%" android:toYDelta="0" /> </set>
<!--anim_dialog_exit--> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <alpha android:duration="@integer/abc_config_activityShortDur" android:fromAlpha="1.0" android:interpolator="@android:anim/decelerate_interpolator" android:toAlpha="0.0"/> <translate android:duration="150" android:fromYDelta="0" android:toYDelta="70%" /> </set>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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.addressdialogdemo.MainActivity"> <Button android:onClick="set" android:id="@+id/btn_set" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="风格样式设置"/> </LinearLayout>
dialog_address.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择归属地样式" android:id="@+id/textView2" android:background="#cccccc" android:padding="8dp" android:textColor="@color/black" android:textSize="18sp" android:layout_gravity="center_horizontal"/> <ListView android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/lv_list"/> </LinearLayout>
item_address.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="8dp"> <ImageView android:id="@+id/iv_icon" android:layout_width="60dp" android:layout_height="30dp" android:layout_centerVertical="true" android:src="@drawable/shape_address_normal"/> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@+id/iv_icon" android:text="半透明" android:textColor="@color/black" android:textSize="18sp" /> <ImageView android:id="@+id/iv_select" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/ic_selected" /> </RelativeLayout>
在res/drawable下
shape_address_blue.xml shape_address_gray.xml shape_address_green.xml shape_normal_blue.xml shape_address_orange.xml只需要把下面代码需要以下color即可
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--颜色--> <solid android:color="@color/global_blue"/> <!--给矩形加圆角--> <corners android:radius="6dp"/> </shape>
在res/values/colors.xml添加需求颜色值即可如
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="red">#F00</color> <color name="black">#000</color> <color name="gray">#a000</color> <color name="global_blue">#459FD7</color> <color name="white">#fff</color> <color name="light_gray">#cccccc</color> <color name="light_green">#00ffa1</color> </resources>
在res/values/style.xml中在resources节点下添加style
<!--归属地弹窗样式--> <style name="AddressDialogStyle" parent="Theme.AppCompat.Dialog"> <!--去掉标题栏--> <item name="android:windowNoTitle">true</item> <!--去掉背景--> <item name="android:windowBackground">@color/white</item> <!--设置进入退出动画--> <item name="android:windowAnimationStyle">@style/AddressAnimStyle</item> </style> <!--归属地弹窗动画--> <style name="AddressAnimStyle"> <item name="android:windowEnterAnimation">@anim/anim_dialog_enter</item> <item name="android:windowExitAnimation">@anim/anim_dialog_exit</item> </style>
效果图: