360项目

Wesley13
• 阅读 804

shape资源创建图片 (重点)

1.res -> drawable -> xxx.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="rectangle"
        >
        <!-- shape : 图片的形状  rectangle:矩形  oval:椭圆,圆形 line:线   ring:环形-->
        <!-- corners : 角的弧度 -->
        <corners android:radius="32dp"/>
        <!-- solid 颜色 -->
        <solid android:color="#99FFFFFF"/>
        <!-- size : 设置宽高 -->
        <size android:width="32dp"
              android:height="32dp"
            />
        <!-- gradient : 渐变色  angle:渐变的角度 -->
        <gradient android:startColor="#FF0000" android:centerColor="#00FF00" android:endColor="#0000FF" android:angle="-90"/>

    </shape>
2.布局文件使用
    <!-- layout_margin : 距离父控件上下左右的距离 
         scaleType : 设置图片显示类型,center:保持图片大小不变,并在ImageView中心显示
    -->
    <ImageView 
        android:id="@+id/home_btn_setting"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/setting"
        android:layout_alignParentRight="true"
        android:layout_margin="4dp"
        android:background="@drawable/shape_home_setting"
        android:scaleType="center"
        />

状态选择器 (重点)

状态选择器:特殊的图片,可以根据不同的状态显示不同的图片,比如按下,抬起

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed :按下显示的图片-->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused :获取焦点显示的图片-->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered :鼠标悬停显示的图片-->
    <item android:drawable="@drawable/button_normal" /> <!-- default : 默认显示的状态-->
</selector>

步骤:
    1.res -> drawable -> xxx.xml
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_pressed="true"
                  android:drawable="@drawable/shape_home_setting_pressed" /> <!-- pressed :按下显示的图片-->
            <item android:drawable="@drawable/shape_home_setting" /> <!-- default : 默认显示的状态-->
        </selector>
    2.布局文件使用,设置控件的背景
         <!-- layout_margin : 距离父控件上下左右的距离 
             scaleType : 设置图片显示类型,center:保持图片大小不变,并在ImageView中心显示
             clickable : 设置imageView可以点击
        -->
        <ImageView 
            android:id="@+id/home_btn_setting"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/setting"
            android:layout_alignParentRight="true"
            android:layout_margin="4dp"
            android:background="@drawable/selector_home_setting"
            android:scaleType="center"
            android:clickable="true"
            />

展示gridview的数据

1.设置获取数据
    private final String[] TITLES = new String[] { "手机防盗", "骚扰拦截", "软件管家",
        "进程管理", "流量统计", "手机杀毒", "缓存清理", "常用工具" };
    private final String[] DESCS = new String[] { "远程定位手机", "全面拦截骚扰", "管理您的软件",
            "管理运行进程", "流量一目了然", "病毒无处藏身", "系统快如火箭", "工具大全" };
    private final int[] ICONS = new int[] { R.drawable.sjfd, R.drawable.srlj,
            R.drawable.rjgj, R.drawable.jcgl, R.drawable.lltj, R.drawable.sjsd,
            R.drawable.hcql, R.drawable.cygj };
2.设置gridview的adapter展示数据
    /**
     * 初始化控件 2016-9-26 下午5:17:47
     */
    private void initView() {

        ......

        // 根据listview操作一样
        mGridView.setAdapter(new Myadapter());
    }

    private class Myadapter extends BaseAdapter {
        // 设置条目的个数
        @Override
        public int getCount() {
            return ICONS.length;
        }

        // 设置条目的样式
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //将布局文件转化成view对象
            View view = View.inflate(getApplicationContext(), R.layout.home_gridview_item, null);
            //从view对象中获取控件,展示数据
            ImageView mIcon = (ImageView) view.findViewById(R.id.item_iv_icon);
            TextView mTitle = (TextView) view.findViewById(R.id.item_tv_title);
            TextView mDesc = (TextView) view.findViewById(R.id.item_tv_desc);
            //展示数据
            mIcon.setImageResource(ICONS[position]);//根据条目的索引,从数据中获取图片,设置给imageView展示
            mTitle.setText(TITLES[position]);
            mDesc.setText(DESCS[position]);
            return view;
        }

        // 根据条目的索引,获取条目对应的数据
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        // 获取条目的id
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
    }

Gridview的条目样式细节修改

1.修改位置距离
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:padding="6dp"
        android:background="@drawable/selector_home_gridview_item_bg"
        >
        <!-- padding : 距离上下左右内边框的距离 -->
        <ImageView 
            android:id="@+id/item_iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/sjfd"
            android:layout_centerVertical="true"
            />
        <!-- gravity : 控制控件内部内容/控件的位置
             layout_gravity : 控制控件在父控件的位置
             layout_centerVertical : RelativeLayout中才可以使用的属性,让控件在父控件垂直居中
         -->
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_toRightOf="@+id/item_iv_icon"
            android:layout_marginLeft="6dp"
            android:layout_centerVertical="true"
            >
            <TextView 
                android:id="@+id/item_tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="手机防盗"
                android:textSize="18sp"
                android:textColor="#000000"
                android:layout_gravity="center_vertical"
                />
            <TextView 
                android:id="@+id/item_tv_desc"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="远程定位手机"
                android:textSize="14sp"
                android:textColor="#99000000"
                android:layout_marginTop="5dp"
                android:layout_gravity="center_vertical"
                />
        </LinearLayout>

    </RelativeLayout>
2.设置条目的状态选择器
    res -> drawable -> xxx.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_pressed="true" android:drawable="@drawable/antispam_report_button_press"></item>
        <item android:drawable="@drawable/antispam_report_button"></item>
    </selector>

3.修改gridview的行与行,列与列之间的距离

    <!-- numColumns : 设置显示的列数 
     horizontalSpacing : 设置列与列之间的距离
     verticalSpacing : 行与行之间的距离
    -->
    <GridView 
        android:id="@+id/home_gv_gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"
        android:horizontalSpacing="5dp"
        android:verticalSpacing="5dp"
        ></GridView>

跳转设置中心界面并搭建设置中心界面

1.跳转操作
    HomeActivity.java

    /**
     * 设置按钮的点击事件
     * view:被点击的控件的view对象
     * 2016-9-27 上午10:31:12
     */
    public void enterSetting(View view){
        //跳转设置中心界面
        Intent intent = new Intent(this,SettingActivity.class);
        startActivity(intent);
    }
2.搭建设置中心界面
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <!-- paddingTop : 距离控件内顶边框的距离 -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="设置中心" 
            android:background="#429ED6"
            android:textSize="20sp"
            android:textColor="#FFFFFF"
            android:gravity="center"
            android:paddingTop="8dp"
            android:paddingBottom="8dp"
            />

    </LinearLayout>

样式抽取操作 (重点)

因为每个activity的标题的样式都是一样的,所有抽取到样式文件中
1.将属性样式抽取到样式文件中
    res -> values -> styles.xml -> 创建style条目

    <style name="ActivityTitleStyle">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:background">#429ED6</item>
         <item name="android:textSize">20sp</item>
         <item name="android:textColor">#FFFFFF</item>
         <item name="android:gravity">center</item>
         <item name="android:paddingTop">8dp</item>
         <item name="android:paddingBottom">8dp</item>
     </style>
2.布局文件使用样式
     <!-- paddingTop : 距离控件内顶边框的距离 
         style: 设置使用样式
     -->
     <TextView
        style="@style/ActivityTitleStyle"
        android:text="设置中心" 
        />

将设置中心条目的布局抽取到自定义组合控件操作 (重点)

1.创建设置中心条目的布局
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        >

        <TextView 
            android:id="@+id/settingview_tv_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置自动更新"
            android:textColor="#000000"
            android:textSize="18sp"
            android:layout_centerVertical="true"
            />

        <ImageView 
            android:id="@+id/settingview_iv_islock"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/off"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            />
    </RelativeLayout>
2.创建自定义控件
    public class SettingView extends RelativeLayout {

        public SettingView(Context context) {
            //super(context);
            this(context,null);
        }

        public SettingView(Context context, AttributeSet attrs) {
            //super(context, attrs);
            this(context,attrs,-1);
        }

        public SettingView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            initView();
        }
    }
3.将设置中心条目的布局文件转化为view对象,添加自定义控件中
    /**
     * 将设置中心条目的布局,添加到自定义控件
     * 2016-9-27 上午10:55:58
     */
    private void initView() {
        //将设置中心条目的布局,转化成view对象,添加到自定义控件中
        View view = View.inflate(getContext(), R.layout.settingview, null);
        this.addView(view);//将一个view对象,添加到自定义控件中
    }
4.使用操作
    <cn.itcast.mobliesafe05.view.SettingView
        android:id="@+id/setting_sv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></cn.itcast.mobliesafe05.view.SettingView>

设置条目的背景

因为每个条目的背景都不一样,所有没有抽取背景,直接单独设置
1.创建背景的状态选择器

    res -> drawable -> xxx.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
              android:drawable="@drawable/first_pressed" /> <!-- pressed :按下显示的图片-->
        <item android:drawable="@drawable/first_normal" /> <!-- default : 默认显示的状态-->
    </selector>

2.设置设置中心中的界面的自定义控件

     <cn.itcast.mobliesafe05.view.SettingView
        android:id="@+id/setting_sv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/selector_setting_item_top"
        android:layout_marginTop="8dp"
        android:clickable="true"
        ></cn.itcast.mobliesafe05.view.SettingView>

创建自定义属性操作 (重点)

自定义属性:因为系统没有提供相关属性给我们使用,所以我们要自己创建,自己使用

参考系统的操作
sdk\platforms\android-16\data\res\values\attrs.xml   ->  搜索TextView

步骤
    res -> values -> attrs.xml

    <resources>
         <declare-styleable name="SettingView">
              <!-- 设置文本的属性 -->
              <attr name="title" format="string" /> <!-- name : 属性的名称    format:属性的值的类型 -->
         </declare-styleable>
    </resources>

检测:查看R文件是否有创建属性的标示

使用自定属性的操作 (重点)

1.布局文件中使用自定义属性

    activity_setting.xml

    1.1.设置命名空间
        xmlns:itcast="http://schemas.android.com/apk/res/cn.itcast.mobliesafe05"
    1.2.控件中如何使用
        <cn.itcast.mobliesafe05.view.SettingView
            android:id="@+id/setting_sv_update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/selector_setting_item_top"
            android:layout_marginTop="8dp"
            android:clickable="true"
            itcast:title="设置自动更新"
            ></cn.itcast.mobliesafe05.view.SettingView>
2.因为自定义控件是否无法显示文本,显示文本是通过自定义控件中的textview显示的,所以需要将设置的文本传递给自定义控件的textview进行显示

    cn.itcast.mobliesafe05.view.SettingView.java

    2.1.在自定义控件获取设置给自定义控件的文本数据
        public SettingView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            initView();

            //因为自定义控件无法显示自定义属性设置的文本,所以需要将自定义属性的文本获取出来设置给textview显示
            //1.获取自定义属性的值,因为AttributeSet保存到控件的所有属性的值
            //通过命名空间和属性的名称,获取属性的值
            //namespace : 命名空间
            //name : 属性的名称
            String title = attrs.getAttributeValue(NAMESPACE, "title");

        }
    2.2.将自定义控件中的textview初始化出来
        /**
         * 将设置中心条目的布局,添加到自定义控件
         * 2016-9-27 上午10:55:58
         */
        private void initView() {

            .....

            //初始化控件
            mText = (TextView) view.findViewById(R.id.settingview_tv_text);
            mIcon = (ImageView) view.findViewById(R.id.settingview_iv_islock);
        }
    2.3.将获取的属性的值设置给textview展示
        public SettingView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            .........

            //2.将获取的属性的值设置给textview展示了
            mText.setText(title);
        }

创建一个隐藏显示图片的属性

1.创建自定义的属性
    res -> values -> attrs.xml

    <resources>
         <declare-styleable name="SettingView">
              <!-- 设置文本的属性 -->
              <attr name="title" format="string" /> <!-- name : 属性的名称    format:属性的值的类型 -->
              <!-- 隐藏显示图片的属性 -->
              <attr name="istoggle" format="boolean" />
         </declare-styleable>
    </resources>
2.布局文件中使用
    2.1.命名空间
         xmlns:itcast="http://schemas.android.com/apk/res/cn.itcast.mobliesafe05"
    2.2.控件中使用
         <cn.itcast.mobliesafe05.view.SettingView
            ......
            itcast:istoggle="true"
            ></cn.itcast.mobliesafe05.view.SettingView>
3.在自定义控件中获取属性的值,根据属性的值设置图片隐藏显示

    SettingView.java

    public SettingView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        .......

        //获取隐藏显示图片属性的值,根据属性的值设置图片的隐藏显示
        //参数3:默认的值,表示没有获取到属性的值的时候,使用什么样的值
        boolean b = attrs.getAttributeBooleanValue(NAMESPACE, "istoggle", true);
        //根据获取的值,设置图片显示隐藏
        mIcon.setVisibility(b ? View.VISIBLE : View.GONE);//设置控件的隐藏显示
    }

开启关闭开关

1.在SettingActivity中设置条目的点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.setting_sv_update:

            //按钮是开启 -> 关闭   关闭 -> 开启

            break;

        default:
            break;
        }
    }
2.因为在Activity中点击条目,更改的时候自定义控件中的图片的值,所以需要在自定义控件中创建方法,方便activity调用
    /**
     * 提供给activity调用的方法,通过activity传递过来的值,设置开启还是关闭操作
     * 2016-9-27 下午2:58:45
     */
    public void setToggleOn(boolean isToggle){
        //保存开关的状态
        mIsToggle = isToggle;
        if (isToggle) {
            mIcon.setImageResource(R.drawable.on);
        }else{
            mIcon.setImageResource(R.drawable.off);
        }
    }

    /**
     * 提供给activity调用的,返回给activity的开关的状态
     * 2016-9-27 下午3:01:41
     */
    public boolean isToggle(){
        return mIsToggle;
    }
3.在Activity的点击事件中调用自定义控件中创建的方法使用
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.setting_sv_update:

            //开启 -> 关闭   关闭 -> 开启
            //问题:需要知道开关是开启还是关闭
            if (mUpdate.isToggle()) {
                mUpdate.setToggleOn(false);
            }else{
                mUpdate.setToggleOn(true);
            }

            break;

        default:
            break;
        }
    }

开启关闭优化操作

1.在SettingView自定义控件中创建优化的方法
    /**
     * 封装了开启 ->关闭  关闭 -> 开启的操作
     * 2016-9-27 下午3:08:41
     */
    public void toggle(){
        //第一步优化
        /*if (isToggle()) {
            setToggleOn(false);
        }else{
            setToggleOn(true);
        }*/
        //第二步优化
        /*if (mIsToggle) {
            setToggleOn(!mIsToggle);
        }else{
            setToggleOn(!mIsToggle);
        }*/
        //第三步优化
        setToggleOn(!mIsToggle);
    }
2.在Activity中点击事件中实现调用优化方法
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.setting_sv_update:

            //按钮是开启 -> 关闭   关闭 -> 开启
            mUpdate.toggle();

            break;

        default:
            break;
        }
    }

回显开关状态

点击条目开启/关闭按钮的时候,保存按钮的开关状态,当再次进入的时候,获取保存的状态,根据保存的状态设置按钮的开启和关闭

具体步骤:
    1.创建SharedPreferences工具类,设置保存和获取数据的操作
        public class SharedPreferencesUtils {

            private static SharedPreferences sp;

            /**
             * 保存boolean信息的操作
             * 2016-9-27 下午3:18:45
             */
            public static void saveBoolean(Context context,String key,boolean value){
                //name : 保存信息的文件的名称
                if (sp==null) {
                    sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
                }
                //保存数据
                //key : 保存信息的名称
                //value : 保存的信息
                sp.edit().putBoolean(key, value).commit();
            }
            /**
             * 获取boolean信息的操作
             * 2016-9-27 下午3:22:06
             */
            public static boolean getBoolean(Context context,String key,boolean defValue){
                if (sp==null) {
                    sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
                }
                //key : 保存信息的名称
                //defValue : 默认的值
                return sp.getBoolean(key, defValue);
            }
        }
    2.在activity的点击事件中保存开关状态
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.setting_sv_update:

                //按钮是开启 -> 关闭   关闭 -> 开启
                mUpdate.toggle();
                //保存开关状态,方便回显操作
                SharedPreferencesUtils.saveBoolean(this, "isUpdate", mUpdate.isToggle());

                break;

            default:
                break;
            }
        }
    3.在再次进入activity进行回显操作

        private void initView() {
            mUpdate = (SettingView) findViewById(R.id.setting_sv_update);

            //设置自动更新的点击事件
            mUpdate.setOnClickListener(this);

            //再次进入界面回显设置自动更新的开关操作
            setUpdate();
        }

        /**
         * 回显设置自动更新开关状态
         * 2016-9-27 下午3:25:21
         */
        private void setUpdate() {
            boolean b = SharedPreferencesUtils.getBoolean(this, "isUpdate", true);
            //根据保存的状态,设置开关状态
            mUpdate.setToggleOn(b);
        }

SharedPreferences的key的优化操作

1.创建公共接口
    public interface Constants {

        /**设置自动更新的key**/
        public static final String ISUPDATE="isUpdate";

    }
2.在代码中使用
    boolean b = SharedPreferencesUtils.getBoolean(this, Constants.ISUPDATE, true);

根据保存的开关状态控制是否显示更新对话框

    cn.itcast.mobliesafe05.SplashActivity.java

    private void initView() {
        mVersion = (TextView) findViewById(R.id.splash_tv_version);

        ....

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {

                //获取保存的设置中心设置自动更新按钮的开关状态,如果是true:更新操作,如果是false:不再更新,跳转首页
                boolean b = SharedPreferencesUtils.getBoolean(getApplicationContext(), Constants.ISUPDATE, true);
                if (b) {
                    update();
                }else{
                    //跳转到首页
                    enterHome();
                }

            }
        }, 2000);//延迟多久给handler发送消息



    }

设置显示设置密码对话框 (重点)

HomeActivity.java

1.设置gridview条目的点击事件
    private void initView() {
        ....

        //设置gridview的条目点击事件
        mGridView.setOnItemClickListener(this);
    }

    /**gridview条目点击事件**/
    //view : 被点击条目的view对象
    //position : 被点击的条目的索引
    //id : 被点击的条目的id
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        switch (position) {
        case 0:
            //手机防盗
            //弹出设置密码/输入密码对话框
            showSetPassWordDialog();
            break;
        }
    }
2.创建设置密码对话框的布局
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <!-- drawableLeft : 在文本的左边设置图片 
             drawablePadding : 设置图片和文本的距离
        -->
        <TextView 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="初始化密码设置"
            android:textColor="#000000"
            android:textSize="18sp"
            android:drawableLeft="@drawable/dialog_title_default_icon"
            android:padding="8dp"
            android:drawablePadding="8dp"
            android:gravity="center_vertical"
            android:background="@drawable/dialog_title_background"
            />
        <!-- inputType : 设置输入的类型 -->
        <EditText 
            android:id="@+id/dialog_et_psw"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入密码"
            android:inputType="textPassword"
            android:layout_margin="8dp"
            />

        <EditText 
            android:id="@+id/dialog_et_confirm"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请再次输入密码"
            android:inputType="textPassword"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            />

        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="8dp"
            >
            <Button 
                android:id="@+id/dialog_btn_ok"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="确定"
                android:layout_marginRight="4dp"
                android:background="@drawable/selector_home_dialog_ok"
                android:textColor="#FFFFFF"
                />

            <Button 
                android:id="@+id/dialog_btn_cancel"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="取消"
                android:layout_marginLeft="4dp"
                android:background="@drawable/selector_home_dialog_cancel"
                />

        </LinearLayout>
    </LinearLayout>
3.设置显示对话框
    private void showSetPassWordDialog() {
        AlertDialog.Builder builder = new Builder(this);
        //将布局文件转化为view对象
        View view = View.inflate(this, R.layout.home_setpassword_dialog, null);
        //将一个布局文件的view对象设置给dialog,通过dialog显示
        builder.setView(view);
        builder.show();
    }

设置密码对话框的操作

private void showSetPassWordDialog() {
    AlertDialog.Builder builder = new Builder(this);
    //将布局文件转化为view对象
    View view = View.inflate(this, R.layout.home_setpassword_dialog, null);

    //初始化控件,设置操作
    final EditText mPsw = (EditText) view.findViewById(R.id.dialog_et_psw);
    final EditText mConfirm = (EditText) view.findViewById(R.id.dialog_et_confirm);
    Button mOk = (Button) view.findViewById(R.id.dialog_btn_ok);
    Button mCancel = (Button) view.findViewById(R.id.dialog_btn_cancel);

    //设置确定和取消按钮的点击事件
    mOk.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //1.获取输入的密码
            String psw = mPsw.getText().toString().trim();
            //判断密码是否为空
            if (TextUtils.isEmpty(psw)) {// null    ""
                Toast.makeText(getApplicationContext(), "密码不能为空", 0).show();
                //不能执行其他操作
                return;
            }
            //2.获取再次输入密码
            String confirm = mConfirm.getText().toString().trim();
            //判断两次输入密码是否一致
            if (psw.equals(confirm)) {
                Toast.makeText(getApplicationContext(), "密码设置成功", 0).show();
                //隐藏对话框
                dialog.dismiss();
            }else{
                Toast.makeText(getApplicationContext(), "两次密码不一致", 0).show();
            }
        }
    });
    mCancel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //隐藏对话框
            dialog.dismiss();
        }
    });

    //将一个布局文件的view对象设置给dialog,通过dialog显示
    builder.setView(view);
    //builder.show();
    dialog = builder.create();
    dialog.show();
}

判断弹出设置密码对话框还是输入密码对话框

1.修改SharedPreferencesUtils工具类,增加保存String类型数据的操作
    /**
     * 保存String信息的操作
     * 2016-9-27 下午3:18:45
     */
    public static void saveString(Context context,String key,String value){
        //name : 保存信息的文件的名称
        if (sp==null) {
            sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
        }
        //保存数据
        //key : 保存信息的名称
        //value : 保存的信息
        sp.edit().putString(key, value).commit();
    }
    /**
     * 获取String信息的操作
     * 2016-9-27 下午3:22:06
     */
    public static String getString(Context context,String key,String defValue){
        if (sp==null) {
            sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
        }
        //key : 保存信息的名称
        //defValue : 默认的值
        return sp.getString(key, defValue);
    }
2.在HomeActivity的设置密码对话框中,密码设置成功,保存设置的密码
    private void showSetPassWordDialog() {

        .....

        //设置确定和取消按钮的点击事件
        mOk.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                ......

                //判断两次输入密码是否一致
                if (psw.equals(confirm)) {

                    .......

                    //保存的设置的密码
                    SharedPreferencesUtils.saveString(getApplicationContext(), Constants.SJFDPSW, psw);
                }else{
                    Toast.makeText(getApplicationContext(), "两次密码不一致", 0).show();
                }
            }
        });

        .....
    }
3.在Gridview条目点击事件中,增加判断操作
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        switch (position) {
        case 0:
            //手机防盗
            //弹出设置密码/输入密码对话框
            //判断是弹出设置密码对话框还是弹出输入密码对话框
            //可以在设置密码成功的是将密码保存,获取保存的密码来判断是弹出设置密码还是输入密码对话框
            String sp_psw = SharedPreferencesUtils.getString(getApplicationContext(), Constants.SJFDPSW, "");
            if (TextUtils.isEmpty(sp_psw)) {
                //弹出设置密码对话框
                showSetPassWordDialog();
            }else{
                //弹出输入密码对话框
                Toast.makeText(getApplicationContext(), "弹出输入密码对话框", 0).show();
            }

            break;
        }
    }

输入密码对话框操作

参考设置密码对话框

/**
 * 显示输入密码对话框
 * 2016-9-27 下午4:59:58
 */
private void showEnterPassWordDialog() {
    AlertDialog.Builder builder = new Builder(this);
    //将布局文件转化为view对象
    View view = View.inflate(this, R.layout.home_enterpassword_dialog, null);

    //初始化控件,设置操作
    final EditText mPsw = (EditText) view.findViewById(R.id.dialog_et_psw);
    Button mOk = (Button) view.findViewById(R.id.dialog_btn_ok);
    Button mCancel = (Button) view.findViewById(R.id.dialog_btn_cancel);

    mOk.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //1.获取输入的密码
            String psw = mPsw.getText().toString().trim();
            if (TextUtils.isEmpty(psw)) {
                Toast.makeText(getApplicationContext(), "密码不能为空", 0).show();
                return;
            }
            //2.判断密码输入是否正确了
            //判断输入的跟保存的是否一致
            String sp_psw = SharedPreferencesUtils.getString(getApplicationContext(), Constants.SJFDPSW, "");
            //判断密码是否正确了
            if (psw.equals(sp_psw)) {
                Toast.makeText(getApplicationContext(), "密码正确", 0).show();
                dialog.dismiss();
            }else{
                Toast.makeText(getApplicationContext(), "密码错误", 0).show();
            }
        }
    });

    mCancel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    //将一个布局文件的view对象设置给dialog,通过dialog显示
    builder.setView(view);
    //builder.show();
    dialog = builder.create();
    dialog.show();
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android选项卡TabHost功能和用法
1、布局文件<TabHostxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:id"@android:id/tabhost"
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这