2011-10-20 61 views
9

Tôi có thể đặt bố cục thích hợp cho tùy chọn thông qua thuộc tính android: layout. Đối với một ví dụCách khởi tạo bố cục cho tùy chọn tùy chỉnh, sử dụng thuộc tính android: layout

<Preference android:key="friction" android:title="@string/friction" android:layout="@layout/friction_fragment" android:shouldDisableView="true" android:defaultValue="30" android:enabled="true" android:selectable="true" android:summary="Bite friction"></Preference> 

nơi bố trí là

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:text="@string/friction" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"></TextView> 
    <SeekBar android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/sbFriction"></SeekBar> 
    <TextView android:text="@string/friction_little" android:id="@+id/txtSummary" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
    <Button android:text="Button" android:id="@+id/btnFriction" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 

</LinearLayout> 

Tôi có thể lấy quan điểm trong OnCreate trong PreferenceActivity

Preference fric = (Preference)this.findPreference("friction"); 
    View v = fric.getView(null, null); 
    SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction); 
    sbFriction.setOnSeekBarChangeListener(this); 
    Button btnFric = (Button) v.findViewById(R.id.btnFriction); 
    btnFric.setOnClickListener(m_onClick); 

nhưng những sự kiện người nghe, mà tôi đã thiết lập, không bị sa thải. Làm thế nào tôi có thể nắm bắt các sự kiện này, ví dụ - bấm vào từ nút. Chỉnh sửa. Không, Nó không gây ra bất kỳ ngoại lệ nào. Đây là mã chi tiết hơn

public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener, OnSeekBarChangeListener 
{ 

    private TextView m_txtSummary; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     ListPreference difficulty = (ListPreference)this.findPreference("difficulty"); 
     difficulty.setSummary(difficulty.getEntry()); 
     difficulty.setOnPreferenceChangeListener(this); 

     Preference fric = (Preference)this.findPreference("friction"); 
     View v = fric.getView(null, null); 
     SeekBar sbFriction = (SeekBar)v.findViewById(R.id.sbFriction); 
     sbFriction.setOnSeekBarChangeListener(this); 
     Button btnFric = (Button) v.findViewById(R.id.btnFriction); 
     btnFric.setOnClickListener(m_onClick); 

     m_txtSummary = (TextView)v.findViewById(R.id.txtSummary); 

     fric.setSummary(fric.toString()); 
     fric.setOnPreferenceChangeListener(this); 

     CheckBoxPreference music = (CheckBoxPreference)this.findPreference("music"); 
     music.setOnPreferenceChangeListener(this); 
    } 

    private OnClickListener m_onClick = new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      v.getId(); 
     } 

    }; 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     if(newValue instanceof Boolean) 
      return true; 

     preference.setSummary(newValue.toString()); 
     return true; 
    } 

    @Override 
    public void onProgressChanged(SeekBar v, int nProgress, boolean arg2) { 
     // TODO Auto-generated method stub 
     m_txtSummary.append(" " + nProgress); 
     m_txtSummary.invalidate(); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar arg0) { 
     // TODO Auto-generated method stub 
     //notifyChanged(); 
    } 
} 
+0

Bất kỳ trường hợp ngoại lệ hoặc lỗi bị sa thải? Với tôi có vẻ như nó sẽ hoạt động. Hãy thử btnFric.setOnClickListener (new OnClickListener() {@Override ...}); – Vinay

+0

Không, nó không gây ra bất kỳ ngoại lệ nào. – hardsky

+0

Tôi được kế thừa từ Sở thích, như được trả lời ở đây [link] (http://stackoverflow.com/questions/5050272/android-seekbarpreference) – hardsky

Trả lời

2

Tôi không chắc chắn bạn có thể sử dụng một cách bố trí tùy chỉnh kết hợp với một PreferenceActivity theo cách mà bạn mô tả ở trên.

Tôi tin rằng bạn có nên:

Sử dụng một PreferenceScreen qua addPreferencesFromResource() và thực hiện các lớp học như CheckBoxPreference, DialogPreference, và MultiSelectListPreference cho SharedPreferences mục. (example)

hoặc

Tạo một tùy chỉnh Activity (không PreferenceActivity) với bố cục tùy chỉnh (sử dụng setContentView()), và bằng tay móc vào SharedPreferences sử dụng PreferenceManager.getDefaultSharedPreferences() chỉnh sửa chúng trong người nghe sự kiện (View.onClickListener(), vv) sử dụng SharedPreferences.Editor.

Hy vọng điều đó có ý nghĩa.

+0

Vâng, tôi đã làm tương tự như ưu đãi đầu tiên. – hardsky

0

Thực ra tôi đã tìm thấy giải pháp khác. Bạn vẫn có thể sử dụng Preferenceability:

Chỉ cần thêm Phân đoạn gọi là Bố cục tùy chỉnh và thêm lớp đó. Tuy nhiên bạn sẽ nhận được một cảnh báo trong Manifest: (bạn có thể bỏ qua hoặc sửa chữa)

[res] (AndroidManifest.xml)

   android:name=".SettingsActivity_CUSTOMLAYOUT1" 

"YOURPACKAGE.SettingsActivity_CUSTOMLAYOUT1 không được công khai"

nó chỉ gọi từ SettingsActivity để bạn có thể bỏ qua nó

hoặc

nếu bạn muốn gọi Hoạt động fr này om bên ngoài chỉ cần tạo một lớp riêng cho nó và đặt tên là SettingsActivity_CUSTOMLAYOUT1.java.

Mã sản phẩm:

[java] (SettingsActivity.java)

public class SettingsActivity extends AppCompatPreferenceActivity { 

    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object value) { 
      String stringValue = value.toString(); 

      if (preference instanceof ListPreference) { 
       ListPreference listPreference = (ListPreference) preference; 
       int index = listPreference.findIndexOfValue(stringValue); 
       preference.setSummary(
         index >= 0 
           ? listPreference.getEntries()[index] 
           : null); 

      } else if (preference instanceof RingtonePreference) { 
       if (TextUtils.isEmpty(stringValue)) { 
        preference.setSummary(R.string.pref_ringtone_silent); 

       } else { 
        Ringtone ringtone = RingtoneManager.getRingtone(
          preference.getContext(), Uri.parse(stringValue)); 

        if (ringtone == null) {       
         preference.setSummary(null); 
        } else { 
         String name = ringtone.getTitle(preference.getContext()); 
         preference.setSummary(name); 
        } 
       } 

      } else { 
       preference.setSummary(stringValue); 
      } 
      return true; 
     } 
    }; 

    private static boolean isXLargeTablet(Context context) { 
     return (context.getResources().getConfiguration().screenLayout 
       & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
    } 

    private static void bindPreferenceSummaryToValue(Preference preference) { 
     preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 
     sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
       PreferenceManager 
         .getDefaultSharedPreferences(preference.getContext()) 
         .getString(preference.getKey(), "")); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setupActionBar(); 
    } 


    private void setupActionBar() { 
     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayHomeAsUpEnabled(true); 
     } 
    } 

    @Override 
    public boolean onIsMultiPane() { 
     return isXLargeTablet(this); 
    } 

    @Override 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.pref_headers, target); 
    } 

    protected boolean isValidFragment(String fragmentName) { 
     return PreferenceFragment.class.getName().equals(fragmentName) 
       || YOURFRAGMENT1.class.getName().equals(fragmentName) 
       || YOURFRAGMENT2.class.getName().equals(fragmentName) 
       || CUSTOMLAYOUT1.class.getName().equals(fragmentName) 
       //... Add Fragments 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class YOURFRAGMENT1 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.YOURFRAGMENTXML1); 
      setHasOptionsMenu(true);  
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       startActivity(new Intent(getActivity(), SettingsActivity.class)); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class YOURFRAGMENT2 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_private_data); 
      setHasOptionsMenu(true);  
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       startActivity(new Intent(getActivity(), SettingsActivity.class)); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static class FRAGMENTFORCUSTOMLAYOUT1 extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      startActivity(new Intent(getActivity(), SettingsActivity.class));  
      startActivity(new Intent(getActivity(), CUSTOMLAYOUT1.class)); 
      setHasOptionsMenu(true); 

     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      if (id == android.R.id.home) { 
       startActivity(new Intent(getActivity(), SettingsActivity.class)); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 
    } 

} 

class SettingsActivity_CUSTOMLAYOUT1 extends AppCompatActivity { 

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

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

[xml] (pref_headers.xml)

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

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT1" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$YOURFRAGMENT2" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 

     <header 
     android:fragment="YOURPACKAGE.SettingsActivity$CUSTOMLAYOUT1" 
     android:icon="@drawable/YOURICON" 
     android:title="@string/TITLE"  
     android:summary="@string/SUBTITLE"/> 


</preference-headers> 

[layout] (CUSTOMLAYOUT1.xml)

<?xml version="1.0" encoding="utf-8"?> 
<...your custom layout> 

Dont quên thêm trong Manifest.

[res] (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?> 
<manifest> 
    <application 

     //Add activity 
     <activity 
      android:name=".SettingsActivity_CUSTOMLAYOUT1" 
      android:parentActivityName=".SettingsActivity"> 
     </activity> 


    </application> 

</manifest> 
Các vấn đề liên quan