1

我正在寻找类似于系统android的设置UI的东西。我想要一些像checkboxpreferences,switchpreferences,应用程序启动时的edittextpreferences,然后当用户选择一个首选项打开一个片段,但我只是无法弄清楚。Android设置UI

我已经提到Settings指南,但它坚持使用偏好标题。显示标题时,我不太可能会看到显示文本的开销,这些文本会加载碎片。

例如,

我的偏好头是一样的东西:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" > 

    <!-- These settings headers are only used on tablets. --> 

    <header 
     android:fragment="${packageName}.${activityClass}$GeneralPreferenceFragment" 
     android:title="@string/pref_header_general" /> 
    <header 
     android:fragment="${packageName}.${activityClass}$NotificationPreferenceFragment" 
     android:title="@string/pref_header_notifications" /> 
    <header 
     android:fragment="${packageName}.${activityClass}$DataSyncPreferenceFragment" 
     android:title="@string/pref_header_data_sync" /> 

</preference-headers> 

,只是加载实际数据,我不得不使用它。实际数据将包含复选框和编辑文本。

如果有人就此提供了一些见解,这将是非常好的。如果我可以在加载屏幕时启动实际的片段数据,将会非常有帮助。更好的是,如果我可以控制要调用的片段,并在选择片段项目时调用其他片段。

回答

4

要使用开关等创建自定义首选项标头,您需要在Android文档描述的情况下将PreferenceActivity与Headers一起扩展,然后重写PreferenceActivity.setListAdapter以创建自己的列表适配器,从而创建自定义视图。我用实际的android设置活动的代码制作了一个pastebin来帮助你。 http://pastebin.com/RhSndGCQ

@Override 
public void onBuildHeaders(List<Header> headers) { 
    loadHeadersFromResource(R.xml.settings_headers, headers); 
    updateHeaderList(headers); 
} 

@Override 
public void setListAdapter(ListAdapter adapter) { 
    if (adapter == null) { 
     super.setListAdapter(null); 
    } else { 
     super.setListAdapter(new HeaderAdapter(this, getHeaders(), mAuthenticatorHelper)); 
    } 
} 

private static class HeaderAdapter extends ArrayAdapter<Header> { 
    static final int HEADER_TYPE_CATEGORY = 0; 
    static final int HEADER_TYPE_NORMAL = 1; 
    static final int HEADER_TYPE_SWITCH = 2; 
    private static final int HEADER_TYPE_COUNT = HEADER_TYPE_SWITCH + 1; 

    private final WifiEnabler mWifiEnabler; 
    private final BluetoothEnabler mBluetoothEnabler; 
    private final ProfileEnabler mProfileEnabler; 

    private AuthenticatorHelper mAuthHelper; 

    private static class HeaderViewHolder { 
     ImageView icon; 
     TextView title; 
     TextView summary; 
     Switch switch_; 
    } 

    private LayoutInflater mInflater; 

    static int getHeaderType(Header header) { 
     if (header.fragment == null && header.intent == null) { 
      return HEADER_TYPE_CATEGORY; 
     } else if (header.id == R.id.wifi_settings 
       || header.id == R.id.bluetooth_settings 
       || header.id == R.id.profiles_settings) { 
      return HEADER_TYPE_SWITCH; 
     } else { 
      return HEADER_TYPE_NORMAL; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     Header header = getItem(position); 
     return getHeaderType(header); 
    } 

    @Override 
    public boolean areAllItemsEnabled() { 
     return false; // because of categories 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return getItemViewType(position) != HEADER_TYPE_CATEGORY; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return HEADER_TYPE_COUNT; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    public HeaderAdapter(Context context, List<Header> objects, 
      AuthenticatorHelper authenticatorHelper) { 
     super(context, 0, objects); 

     mAuthHelper = authenticatorHelper; 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     // Temp Switches provided as placeholder until the adapter replaces these with actual 
     // Switches inflated from their layouts. Must be done before adapter is set in super 
     mWifiEnabler = new WifiEnabler(context, new Switch(context)); 
     mBluetoothEnabler = new BluetoothEnabler(context, new Switch(context)); 
     mProfileEnabler = new ProfileEnabler(context, null, new Switch(context)); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     HeaderViewHolder holder; 
     Header header = getItem(position); 
     int headerType = getHeaderType(header); 
     View view = null; 

     if (convertView == null || headerType == HEADER_TYPE_SWITCH) { 
      holder = new HeaderViewHolder(); 
      switch (headerType) { 
       case HEADER_TYPE_CATEGORY: 
        view = new TextView(getContext(), null, 
          android.R.attr.listSeparatorTextViewStyle); 
        holder.title = (TextView) view; 
        break; 

       case HEADER_TYPE_SWITCH: 
        view = mInflater.inflate(R.layout.preference_header_switch_item, parent, 
          false); 
        holder.icon = (ImageView) view.findViewById(R.id.icon); 
        holder.title = (TextView) 
          view.findViewById(com.android.internal.R.id.title); 
        holder.summary = (TextView) 
          view.findViewById(com.android.internal.R.id.summary); 
        holder.switch_ = (Switch) view.findViewById(R.id.switchWidget); 
        break; 

       case HEADER_TYPE_NORMAL: 
        view = mInflater.inflate(
          R.layout.preference_header_item, parent, 
          false); 
        holder.icon = (ImageView) view.findViewById(R.id.icon); 
        holder.title = (TextView) 
          view.findViewById(com.android.internal.R.id.title); 
        holder.summary = (TextView) 
          view.findViewById(com.android.internal.R.id.summary); 
        break; 
      } 
      view.setTag(holder); 
     } else { 
      view = convertView; 
      holder = (HeaderViewHolder) view.getTag(); 
     } 

     // All view fields must be updated every time, because the view may be recycled 
     switch (headerType) { 
      case HEADER_TYPE_CATEGORY: 
       holder.title.setText(header.getTitle(getContext().getResources())); 
       break; 

      case HEADER_TYPE_SWITCH: 
       // Would need a different treatment if the main menu had more switches 
       if (header.id == R.id.wifi_settings) { 
        mWifiEnabler.setSwitch(holder.switch_); 
       } else if (header.id == R.id.bluetooth_settings) { 
        mBluetoothEnabler.setSwitch(holder.switch_); 
       } else if (header.id == R.id.profiles_settings) { 
        mProfileEnabler.setSwitch(holder.switch_); 
       } 
       // No break, fall through on purpose to update common fields 

       //$FALL-THROUGH$ 
      case HEADER_TYPE_NORMAL: 
       if (header.extras != null 
         && header.extras.containsKey(ManageAccountsSettings.KEY_ACCOUNT_TYPE)) { 
        String accType = header.extras.getString(
          ManageAccountsSettings.KEY_ACCOUNT_TYPE); 
        ViewGroup.LayoutParams lp = holder.icon.getLayoutParams(); 
        lp.width = getContext().getResources().getDimensionPixelSize(
          R.dimen.header_icon_width); 
        lp.height = lp.width; 
        holder.icon.setLayoutParams(lp); 
        Drawable icon = mAuthHelper.getDrawableForType(getContext(), accType); 
        holder.icon.setImageDrawable(icon); 
       } else { 
        holder.icon.setImageResource(header.iconRes); 
       } 
       holder.title.setText(header.getTitle(getContext().getResources())); 
       CharSequence summary = header.getSummary(getContext().getResources()); 
       if (!TextUtils.isEmpty(summary)) { 
        holder.summary.setVisibility(View.VISIBLE); 
        holder.summary.setText(summary); 
       } else { 
        holder.summary.setVisibility(View.GONE); 
       } 
       break; 
     } 

     return view; 
    } 

    public void resume() { 
     mWifiEnabler.resume(); 
     mBluetoothEnabler.resume(); 
     mProfileEnabler.resume(); 
    } 

    public void pause() { 
     mWifiEnabler.pause(); 
     mBluetoothEnabler.pause(); 
     mProfileEnabler.pause(); 
    } 
} 
+0

正是我在找的..谢谢你的努力.. – Adithya 2013-02-12 07:38:27