104.归属地风格的自定义选择
来源:互联网 发布:linux man命令怎么用 编辑:程序博客网 时间:2024/05/01 23:53
要求有一个栏目,右边有一个单选的列表框,点击后弹出归属地风格显示的单选框,
首先模拟SettingItemView一样设置自定义的样式
组快的布局文件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="70dp" android:padding="5dp" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="22sp" /> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_title" android:layout_marginTop="3dp" android:textColor="#a000" android:textSize="18sp" /> <ImageView android:id="@+id/cb_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/jiantou1_pressed" /> <View android:layout_width="match_parent" android:layout_height="0.2dp" android:layout_alignParentBottom="true" android:background="#a000" /></RelativeLayout>
组快的逻辑代码SettingItemView.java
package com.ldw.safe.view;import com.ldw.safe.R;import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.widget.CheckBox;import android.widget.RelativeLayout;import android.widget.TextView;/* * 设置自定义相对布局,布局的结构用view_setting_item进行填充,并初始化SettingItemView的方法,来设置或者获取某些参数 */public class SettingItemView extends RelativeLayout {private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.ldw.safe";private TextView tvTitle;private TextView tvDesc;private CheckBox cbStatus;private String mDescOff;private String mDescOn;private String mTitle;public SettingItemView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView();}public SettingItemView(Context context, AttributeSet attrs) {super(context, attrs);/*获取自定义属性的值int attributeCount = attrs.getAttributeCount();for(int i = 0; i< attributeCount; i++){String attributeName = attrs.getAttributeName(i);String attributeValue = attrs.getAttributeValue(i);System.out.println(attributeName + "===" + attributeValue);}*///根据属性的名称获取自定义属性的值,NAMESPACE是命名空间mTitle = attrs.getAttributeValue(NAMESPACE, "title");mDescOn = attrs.getAttributeValue(NAMESPACE, "desc_on");mDescOff = attrs.getAttributeValue(NAMESPACE, "desc_off");initView();}public SettingItemView(Context context) {super(context);initView();}//初始化布局private void initView(){//将定义的布局文件设置成为当前的SettingItemViewView.inflate(getContext(), R.layout.view_setting_item, this);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);//根据选择的状态更新textViewif(check){setDesc(mDescOn);}else{setDesc(mDescOff);}}}
设置模块的布局文件activity_setting.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ldw="http://schemas.android.com/apk/res/com.ldw.safe" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView style="@style/TitleStyle" android:text="手机设置" /> <com.ldw.safe.view.SettingItemView android:id="@+id/siv_update" android:layout_width="match_parent" android:layout_height="wrap_content" ldw:title="自动更新设置" ldw:desc_on="自动更新已开启" ldw:desc_off="自动更新已关闭" /> <com.ldw.safe.view.SettingItemView android:id="@+id/siv_address" android:layout_width="match_parent" android:layout_height="wrap_content" ldw:title="电话归属地显示设置" ldw:desc_on="电话归属地显示已开启" ldw:desc_off="电话归属地显示已关闭" /> <com.ldw.safe.view.SettingClickView android:id="@+id/scv_address_style" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
设置模块中的逻辑代码,点击组合控件,弹出一系列的选择对话框,选择以后保存数据,同时初始化数据
ActivitySetting.java
package com.ldw.safe.Activity;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import com.ldw.safe.R;import com.ldw.safe.service.AddressService;import com.ldw.safe.utils.ServiceStatusUtils;import com.ldw.safe.view.SettingClickView;import com.ldw.safe.view.SettingItemView;/** * 设置中心 */public class SettingActivity extends Activity {private SettingItemView siv_update;//设置自动更新private SettingItemView siv_address;//归属地private SettingClickView scv_address_style;//归属地显示的风格private SharedPreferences mPref;//把设置的数据保存在mPref@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); //把设置的数据保存在mPref mPref = getSharedPreferences("config", MODE_PRIVATE); initUpdateView();//初始化自动升级开关 initAdressView();//初始化归属地开关 initAddressStyle();//初始化归属地样式的选择}/* * 初始化自动升级开关 */private void initUpdateView(){siv_update = (SettingItemView)findViewById(R.id.siv_update); //siv_update.setTitle("自动更新设置"); //获取保存的数据,判断之前选择的是开始还是关闭,初始化进入界面是否勾选 boolean autoUpdate = mPref.getBoolean("auto_update", true); if(autoUpdate){ siv_update.setDesc("自动更新已经开启"); siv_update.setChecked(true); }else{ siv_update.setDesc("自动更新已经关闭"); siv_update.setChecked(false); } siv_update.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//判断右边框的勾选状态if(siv_update.isChecked()){//设置不勾选siv_update.setChecked(false);//siv_update.setDesc("自动更新已经关闭");//编辑mPref的值mPref.edit().putBoolean("auto_update", false).commit();}else{//设置勾选siv_update.setChecked(true);//siv_update.setDesc("自动更新已经开启");//编辑mPref的值mPref.edit().putBoolean("auto_update", true).commit();}} });}/* * 初始化归属地开关 */private void initAdressView(){siv_address = (SettingItemView) findViewById(R.id.siv_address);//判断归属地的服务是否在运行boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this, "com.ldw.safe.service.AddressService");//让服务的那个勾选框根据系统中是否有服务来判断是否去开启if(serviceRunning){siv_address.setChecked(true);}else{siv_address.setChecked(false);}siv_address.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(siv_address.isChecked()){siv_address.setChecked(false);stopService(new Intent(SettingActivity.this, AddressService.class));}else{siv_address.setChecked(true);//号码归属地显示开启的时候要开启服务startService(new Intent(SettingActivity.this, AddressService.class));}}});}/* * 修改号码归属地提示框的风格 */private void initAddressStyle(){scv_address_style = (SettingClickView) findViewById(R.id.scv_address_style);scv_address_style.setTitle("归属地提示框风格");//获取保存的样式int style = mPref.getInt("address_Style", 0);//设置样式scv_address_style.setDesc(items[style]);scv_address_style.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowSingleChooseDialog();}});}final String[] items = new String[]{"半透明", "活力橙", "卫士蓝", "金属灰", "苹果绿"};/* * 弹出归属地样式选择的单选框 */public void showSingleChooseDialog(){AlertDialog.Builder builder = new AlertDialog.Builder(this);//设置选择框额logobuilder.setIcon(R.drawable.ic_launcher);builder.setTitle("归属地提示框风格");//获取保存的风格样式,默认为0int style = mPref.getInt("address_Style", 0);builder.setSingleChoiceItems(items, style, new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {//保存选择的样式的序号mPref.edit().putInt("address_Style", which).commit();//点击以后对话框消失dialog.dismiss();//设置组合控件的文字描述scv_address_style.setDesc(items[which]);}});builder.setNegativeButton("取消", null);builder.show();}}
在服务中使用自己选择的样式,首先获取到保存的样式数据再设置样式
package com.ldw.safe.service;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.graphics.PixelFormat;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.view.View;import android.view.WindowManager;import android.widget.TextView;import com.ldw.safe.R;import com.ldw.safe.db.dao.AddressDao;/* * 来电提醒的服务 */public class AddressService extends Service {private TelephonyManager tm;private MyListener listener;private OutCallReceiver receiver;private WindowManager mWM;//private TextView view;private View view;private SharedPreferences mPref;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate(){super.onCreate();//读取样式的配置参数mPref = getSharedPreferences("config", MODE_PRIVATE);tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//监听打电话的状态receiver = new OutCallReceiver();IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);registerReceiver(receiver, filter);//动态注册广播}class MyListener extends PhoneStateListener{//监听电话状态的变化@Overridepublic void onCallStateChanged(int state, String incomingNumber){//switch(state){//电话铃声响起case TelephonyManager.CALL_STATE_RINGING:System.out.println("CALL_STATE_RINGING");//获取来电的号码归属地String address = AddressDao.getAddress(incomingNumber);//Toast的形式弹出号码归属地//Toast.makeText(AddressService.this, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);break;//监听电话闲置的事件case TelephonyManager.CALL_STATE_IDLE://关闭自定义的Toast显示if(mWM != null && view != null){//挂断电话的时候,移除窗体mWM.removeView(view);}break;default:break;}super.onCallStateChanged(state, incomingNumber);}}/* * 监听去电 的广播接收者,添加权限PROCESS_OUTGOING_CALLS */class OutCallReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//获取到来电的号码String number = getResultData();//获取到号码的归属地String address = AddressDao.getAddress(number);//Toast的形式弹出号码归属地//Toast.makeText(context, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);}} @Override public void onDestroy(){ super.onDestroy(); //关闭服务,停止来电监听 tm.listen(listener, PhoneStateListener.LISTEN_NONE); //注销广播 unregisterReceiver(receiver); } /* * 自定义归属地显示浮窗,取代Toast */ private void showToast(String text){ mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); final WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle("Toast"); //原始的view显示 //view = new TextView(this); //自定义的view显示 view = View.inflate(this, R.layout.toast_address, null); //初始化样式 int[] bgs = new int[] { R.drawable.call_locate_white,R.drawable.call_locate_orange, R.drawable.call_locate_blue,R.drawable.call_locate_gray, R.drawable.call_locate_green }; //获取保存的样式数据int style = mPref.getInt("address_Style", 0);//设置样式view.setBackgroundResource(bgs[style]); TextView tvAddress= (TextView) view.findViewById(R.id.tv_address); tvAddress.setText(text); //tvAddress.setTextColor(Color.BLUE); //将view添加到窗体 mWM.addView(view, params); }}
0 0
- 104.归属地风格的自定义选择
- 3.11 选择归属地显示风格:单选对话框
- 3.10 号码归属地显示风格 :自定义Toast
- 归属地显示&归属地显示风格设置&归属地显示的位置&趣味小火箭&4.趣味题:两次点击退出
- 号码归属地的查询
- 手机号的归属地查询
- 自定义Toast显示归属地查询结果
- 9.来电显示归属地--自定义Toast
- 20、高级工具--更改归属地显示风格
- 105.实现自定义归属地提示框的拖拽1
- 106.实现自定义归属地提示框的拖拽2
- 电话号码归属地批量查询软件选择需谨慎
- 手机归属地查询的部分代码
- flex 查查你的号码归属地
- 查询ip归属地的shell脚本
- 电话归属地查询的实现
- 获取手机号码 归属地的接口
- 判断手机号码归属地的正则表达式
- (蓝桥杯)基础练习 高精度加法
- 树形dp 总结(转)
- c程序实例
- 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】
- 蓝桥 ADV-233 算法提高 队列操作 【STL】
- 104.归属地风格的自定义选择
- 2017/4/6
- 聚类分析学习笔记(三)
- Android底层调用的入门---JNI实践
- 真实GPS坐标信息转百度地图坐标
- 利用递归实现全排列
- Android 学习资料收集
- 【计算机视觉】关于用opencv 设置摄像头读分辨率问题的若干说明
- Java序列化和反序列化