如何将Settings中的PreferenceActivity 修改成 Activity

我们都知道设置中的设置项界面都是使用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点击事件:根据不同的列表项执行不同的操作

本文纯粹是为记录自己的程序过程,如有不对,还望指出

https://download.csdn.net/download/qq_32390877/10682782

猜你喜欢

转载自blog.csdn.net/qq_32390877/article/details/82813417