Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 手機安全衛士——在設置中心 自定義view和自定義屬性,安全衛士view

手機安全衛士——在設置中心 自定義view和自定義屬性,安全衛士view

編輯:關於android開發

手機安全衛士——在設置中心 自定義view和自定義屬性,安全衛士view


自定義組合控件
1. 自定義一個View, 繼承ViewGroup,比如RelativeLayout,此文中是SettingItemView
2. 編寫組合控件的布局文件,在自定義的View中加載
            // 將自定義好的布局文件設置給當前的SettingItemView
        View.inflate(getContext(), R.layout.view_setting_item, this);
3. 自定義屬性

      刪除代碼中對文本的動態設置,改為在布局文件中設置

      在布局文件中增加新的命名空間

      創建attrs.xml,定義相關屬性

      讀取自定義的值,更新相關內容

 

activity_setting.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mobilesafe="http://schemas.android.com/apk/res/com.mxn.mobilesafe"//自定義命名空間。。。在布局文件中增加新的命名空間
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        
        style="@style/TitleStyle"
        android:text="設置中心" />

    <com.mxn.mobilesafe.view.SettingItemView
        android:id="@+id/siv_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

//自定義屬性,不用android默認的屬性
//從命名空間中找 mobilesafe:title
="自動更新設置" mobilesafe:desc_on="自動更新已開啟" mobilesafe:desc_off="自動更新已關閉" > </com.mxn.mobilesafe.view.SettingItemView> <com.mxn.mobilesafe.view.SettingItemView android:id="@+id/siv_address" android:layout_width="match_parent" android:layout_height="wrap_content" mobilesafe:title="歸屬地顯示設置" mobilesafe:desc_on="歸屬地顯示已開啟" mobilesafe:desc_off="歸屬地顯示已關閉" > </com.mxn.mobilesafe.view.SettingItemView> <com.mxn.mobilesafe.view.SettingClickView android:id="@+id/scv_address_style" android:layout_width="match_parent" android:layout_height="wrap_content" > </com.mxn.mobilesafe.view.SettingClickView> <com.mxn.mobilesafe.view.SettingItemView android:id="@+id/siv_watchdog" android:layout_width="match_parent" android:layout_height="wrap_content" mobilesafe:title="看門狗設置" mobilesafe:desc_on="看門狗已開啟" mobilesafe:desc_off="看門狗已關閉" > </com.mxn.mobilesafe.view.SettingItemView> </LinearLayout>
自定義屬性 : attrs.xml。。創建attrs.xml,定義相關屬性
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="SettingItemView">
        <attr name="title"  format="string"></attr>
        <attr name="desc_on"  format="string"></attr>
        <attr name="desc_off"  format="string"></attr>
                
    </declare-styleable>
    
</resources>
 
SettingItemView.java
/*
 * 設置中心的自定義控件,自定義View
 */
public class SettingItemView extends RelativeLayout {
    TextView tvTitle;
    TextView tvDesc;
    CheckBox cbStatus;
    private String mtitle;
    private String mdescon;
    private String mdescoff;
String namespace = "http://schemas.android.com/apk/res/com.mxn.mobilesafe";//命名空間 public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); // TODO Auto-generated constructor stub initView(); } public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub initView(); // int attributeCount = attrs.getAttributeCount(); // for(int i=0;i<attributeCount;i++){ // String attrsname = attrs.getAttributeName(i); // String attrvalue = attrs.getAttributeValue(i); // System.out.println(attrsname+"="+attrvalue); // // } } public SettingItemView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub
// 讀取自定義的值,更新相關內容 //根據屬性名稱獲取屬性的值 mtitle = attrs.getAttributeValue(namespace , "title"); mdescon = attrs.getAttributeValue(namespace , "desc_on"); mdescoff = attrs.getAttributeValue(namespace , "desc_off");
initView();
} public SettingItemView(Context context) { super(context); // TODO Auto-generated constructor stub initView(); } // 初始化布局 private void initView() { // 把自定義好的布局設置給當前的SettingItemView View.inflate(getContext(), R.layout.view_setting_item, this);// this表示把view_setting_item布局塞給RelativeLayout tvTitle = (TextView) findViewById(R.id.tv_title); tvDesc = (TextView) findViewById(R.id.tv_desc); cbStatus = (CheckBox) findViewById(R.id.cb_status); setTitle(mtitle); } public void setTitle(String title) { tvTitle.setText(title); } public void setDesc(String desc) { tvDesc.setText(desc); } // 判斷當前的勾選狀態並返回 public boolean isChecked() { return cbStatus.isChecked(); } public void setChecked(boolean check){ cbStatus.setChecked(check); //根據選擇的狀態更新文本描述 if(check){ setDesc(mdescon); }else{ setDesc(mdescoff); } } }
view_setting_item.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="80dp" 
        android:padding="10dp">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
           
            android:textColor="@color/black"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            
            android:textColor="#a000"
            android:layout_below="@id/tv_title"
            android:textSize="15sp"/>
        <CheckBox 
            android:id="@+id/cb_status"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"

//要禁用某些事件,這三個搭配使用。 android:clickable
="false"//表示不能點擊 android:focusable="false"//不能獲取焦點 android:focusableInTouchMode="false" /> <View android:layout_width="match_parent" android:layout_height="0.2dp" android:background="#a000" android:layout_alignParentBottom="true" /> </RelativeLayout>
SettingClickView.java
/*
 * 設置中心的自定義控件,自定義View
 */
public class SettingClickView extends RelativeLayout {
    private TextView tvTitle;
    private TextView tvDesc;

    public SettingClickView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView();
    }

    public SettingClickView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public SettingClickView(Context context) {
        super(context);
        initView();
    }

    /**
     * 初始化布局
     */
    private void initView() {
        // 將自定義好的布局文件設置給當前的SettingClickView
        View.inflate(getContext(), R.layout.view_setting_click, this);
        tvTitle = (TextView) findViewById(R.id.tv_title);
        tvDesc = (TextView) findViewById(R.id.tv_desc);
    }

    public void setTitle(String title) {
        tvTitle.setText(title);
    }

    public void setDesc(String desc) {
        tvDesc.setText(desc);
    }
    
    
}
view_setting_click.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="80dp" 
        android:padding="10dp">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
           
            android:textColor="@color/black"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            
            android:textColor="#a000"
            android:layout_below="@id/tv_title"
            android:textSize="15sp"/>
        <ImageView 
            android:src="@drawable/jiantou1_pressed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:id="@+id/iv_jt"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.2dp"
            android:background="#a000"
            android:layout_alignParentBottom="true"
            />
    </RelativeLayout>

 

運行界面:

 

SettingActivity.java

/**
 * 設置中心
 * 
 * @author mxn
 * 
 */
public class SettingActivity extends Activity {

    private SettingItemView sivUpdate;// 設置自動更新
    private SettingItemView sivAddress;// 設置歸屬地
    private SettingClickView scvAddressStyle;// 修改風格
    private SettingClickView scvAddressLocation;// 修改歸屬地位置
    private SharedPreferences mPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);

        mPref = getSharedPreferences("config", MODE_PRIVATE);
        //MODE_PRIVATE訪問權限
        initUpdateView();
        initAddressView();
        initAddressStyle();           
    }

    /**
     * 初始化自動更新開關
     */
    private void initUpdateView() {
        sivUpdate = (SettingItemView) findViewById(R.id.siv_update);
        // sivUpdate.setTitle("自動更新設置");
        //默認設置的開啟,用戶進入之後
        boolean autoUpdate = mPref.getBoolean("auto_update", true);

        if (autoUpdate) {
            // sivUpdate.setDesc("自動更新已開啟");
            sivUpdate.setChecked(true);
        } else {
            // sivUpdate.setDesc("自動更新已關閉");
            sivUpdate.setChecked(false);
        }

        sivUpdate.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 判斷當前的勾選狀態
                if (sivUpdate.isChecked()) {
                    // 設置不勾選
                    sivUpdate.setChecked(false);
                    // sivUpdate.setDesc("自動更新已關閉");
                    // 更新sp
                    mPref.edit().putBoolean("auto_update", false).commit();
                } else {
                    sivUpdate.setChecked(true);
                    // sivUpdate.setDesc("自動更新已開啟");
                    // 更新sp
                    mPref.edit().putBoolean("auto_update", true).commit();
                }
            }
        });
    }

    /**
     * 初始化歸屬地開關顯示
     */
    private void initAddressView() {
        sivAddress = (SettingItemView) findViewById(R.id.siv_address);

        // 根據歸屬地服務是否運行來更新checkbox
        boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this,
                "com.itheima52.mobilesafe.service.AddressService");

        if (serviceRunning) {
            sivAddress.setChecked(true);
        } else {
            sivAddress.setChecked(false);
        }

        sivAddress.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (sivAddress.isChecked()) {
                    sivAddress.setChecked(false);
                    stopService(new Intent(SettingActivity.this,
                            AddressService.class));// 停止歸屬地服務
                } else {
                    sivAddress.setChecked(true);
                    startService(new Intent(SettingActivity.this,
                            AddressService.class));// 開啟歸屬地服務
                }
            }
        });
    }

    final String[] items = new String[] { "半透明", "活力橙", "衛士藍", "金屬灰", "蘋果綠" };

    /**
     * 修改歸屬地提示框顯示風格
     */
    private void initAddressStyle() {
        scvAddressStyle = (SettingClickView) findViewById(R.id.scv_address_style);

        scvAddressStyle.setTitle("歸屬地提示框風格");

        int style = mPref.getInt("address_style", 0);// 讀取保存的style
        scvAddressStyle.setDesc(items[style]);

        scvAddressStyle.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showSingleChooseDailog();
            }
        });
    }

    /**
     * 彈出選擇風格的單選框
     */
    protected void showSingleChooseDailog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // builder.setIcon(R.drawable.ic_launcher);
        builder.setTitle("歸屬地提示框風格");

        int style = mPref.getInt("address_style", 0);// 讀取保存的style

        builder.setSingleChoiceItems(items, style,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mPref.edit().putInt("address_style", which).commit();// 保存選擇的風格
                        dialog.dismiss();// 讓dialog消失

                        scvAddressStyle.setDesc(items[which]);// 更新組合控件的描述信息
                    }
                });

        builder.setNegativeButton("取消", null);
        builder.show();
    }

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved