我们都知道设置中的设置项界面都是使用PreferenceActivity 来实现的,它是一个非常好用又方便的组件,但是有时候总会有一些奇怪的要求,我的这个是要求将settings中的WifidisplayActivity转化成自己写的Activity,因为用PreferenceActivity的布局是固定的不能添加自己想要的布局,有需求就的实现,谁叫我们是码代码的。
首先看界面:
界面非常的简单就是一个列表,显示可以连接的设备。列表项也非常简单,一个设备名称、一个状态,一个图标
第二,看源码,看了源码之后发现只有一个类WifidisplayActivity .class,心里轻松了一下,看了源码发现它主要有三种状态,一种是第一次连接,一种是二次连接,另一种是设备没有打开wifiDisplay连接,看了界面的代码发现它是通过 preferenceScreen.addPreference(createRoutePreference(route));来添加搜索设备的列表的选项,我们肯定不能通过该发式,通过一系列的尝试,我确定了整体的思路,实现创建一个适配器用于更新列表状态的改变,再创建一个实体类来保存设备的名称,状态等信息,第三个就是ListView的点击事件。
实体类:
适配器:
public class MyAdapter extends BaseAdapter{
private ViewHolder holder;
private Context mContext;
@Override
public int getCount() {
// TODO Auto-generated method stub
return wifiDevices.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return super.isEnabled(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final int positions=position;
//更新设备连接状态
if (convertView == null) {
holder=new ViewHolder();
convertView = View.inflate(getApplicationContext(), R.layout.list_item, null);
holder.WifiDisplayImage = (ImageView) convertView.findViewById(R.id.wifidisplay_image);
holder.wifiDisplayDevice=(TextView) convertView.findViewById(R.id.wifidisplay_id);
holder.wifiDisplayState=(TextView) convertView.findViewById(R.id.wifidisplay_state);
holder.wifiDisplayLinearLayout=(LinearLayout) convertView.findViewById(R.id.wifidisplay_linearLayout);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
int type = wifiDevices.get(positions).getType();
if (type == 2) {//unpari
setStateEnabled(true);
WifiDisplay display = wifiDevices.get(positions).getDisplay();
holder.wifiDisplayDevice.setText(display.getFriendlyDisplayName());
holder.wifiDisplayState.setText(com.android.internal.R.string.wireless_display_route_description);
if (display.canConnect()) {
} else {
setStateEnabled(false);
holder.wifiDisplayState.setText(R.string.wifi_display_status_in_use);
}
}else {
setStateEnabled(true);
RouteInfo route = wifiDevices.get(positions).getRoute();
final WifiDisplay display = findWifiDisplay(route.getDeviceAddress());
holder.wifiDisplayDevice.setText(route.getName());
if (display == null) {
setStateEnabled(false);
} else {
holder.WifiDisplayImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
showWifiDisplayOptionsDialog(display);
}
});
holder.wifiDisplayState.setText(route.getDescription());
if (route.isSelected()) {
if (route.isConnecting()) {
holder.wifiDisplayState.setText(R.string.wifi_display_status_connecting);
} else {
holder.wifiDisplayState.setText(R.string.wifi_display_status_connected);
}
} else {
if (route.isEnabled()) {
} else {
setStateEnabled(false);
if (route.getStatusCode() == MediaRouter.RouteInfo.STATUS_IN_USE) {
holder.wifiDisplayState.setText(R.string.wifi_display_status_in_use);
} else {
holder.wifiDisplayState.setText(R.string.wifi_display_status_not_available);
}
}
}
}
}
return convertView;
}
private void setStateEnabled(boolean isEnabled) {
// TODO Auto-generated method stub
TypedValue value = new TypedValue();
getApplicationContext().getTheme().resolveAttribute(android.R.attr.disabledAlpha,value, true);
if (isEnabled) { //设置字体图片为高亮
float f=1;
holder.WifiDisplayImage.setImageAlpha((int)(f * 255));
holder.wifiDisplayDevice.setTextColor(Color.WHITE);
holder.wifiDisplayState.setTextColor(Color.WHITE);
}else{ //设置字体图片为灰色
if (holder.WifiDisplayImage != null) {
Log.i("wj","isEnabled()==fasle");
holder.WifiDisplayImage.setImageAlpha((int)(value.getFloat() * 255));
holder.WifiDisplayImage.setEnabled(true); // always allow button to be pressed
}
holder.wifiDisplayDevice.setTextColor(Color.GRAY);
holder.wifiDisplayState.setTextColor(Color.GRAY);
}
}
}
class ViewHolder {
ImageView WifiDisplayImage;
TextView wifiDisplayDevice;
TextView wifiDisplayState;
LinearLayout wifiDisplayLinearLayout;
}
ListView点击事件:根据不同的列表项执行不同的操作
本文纯粹是为记录自己的程序过程,如有不对,还望指出