• 自定义归属地风格弹窗


    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>
    

     效果图:

  • 相关阅读:
    js 比较好的博客
    网络相关
    gulp学习笔记--简单入门
    数组和对象的复制
    seajs学习笔记
    art-template引擎模板
    angularJS中的$apply(),$digest(),$watch()
    CMD和AMD
    通过script标签实现跨域
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/loaderman/p/6480747.html
Copyright © 2020-2023  润新知