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>
效果图:

原文:http://www.cnblogs.com/loaderman/p/6480747.html