2012-07-08 18 views
50

Tôi đang cố gắng thực hiện điều gì đó mà tôi nghĩ là khá dễ dàng, nhưng tôi đã hiểu cách thực hiện nó bằng cách sử dụng lớp PreferenceActivity và thẻ tiêu đề xml ưu tiên.Ưu tiên trang đơnTính năng w/không có tiêu đề/phân đoạn?

Khi người dùng nhấn vào biểu tượng cài đặt ứng dụng, tôi muốn họ được trình bày với một danh sách nhỏ các hộp kiểm và danh sách. Tôi chỉ có một phân đoạn ưu tiên duy nhất. Cho đến nay tôi có thể thiết lập các tệp xml PreferenceActivity (preferences.xml và các đoạn ưu tiên xml) để hiển thị tiêu đề duy nhất cho phân đoạn ưu tiên. Khi người dùng chọn tiêu đề đó, màn hình tùy chọn chính xác như cách tôi muốn, tuy nhiên, tôi không thể tìm ra cách bỏ qua hiển thị màn hình tiêu đề đầu tiên.

Có vẻ như lãng phí khi phải nhấn vào biểu tượng cài đặt/tùy chọn, hiển thị một tiêu đề duy nhất sau đó được nhấn để truy cập cài đặt/tùy chọn thực tế.

Tôi hiểu làm thế nào điều này có thể rất hữu ích nếu bạn muốn phân loại sở thích của bạn, nhưng đối với một cái gì đó đơn giản, điều này cho biết thêm chi phí và có vẻ khá clunky.

Tôi hy vọng rằng tôi đã rõ ràng. Tóm lại, đây là câu hỏi của tôi:

Cách ưa thích mới để sử dụng lớp PreferenceActivity và thẻ tiêu đề tùy chọn để chỉ hiển thị một màn hình tùy chọn không có tiêu đề là gì?

Sau khi xem xét một số chi tiết khác, có vẻ như tôi đang cố gắng làm những gì các phương pháp cũ đã làm theo cách thẳng thắn. Tôi đang cố gắng làm điều này mà không sử dụng bất kỳ chức năng không được chấp nhận nào.

Cảm ơn trước, B.

+1

Tôi có yêu cầu tương tự. Kết thúc bằng cách sử dụng giải pháp này https://stackoverflow.com/a/10960720/276263 – krishnakumarp

Trả lời

22

tôi đang tìm kiếm một câu trả lời tương xứng với câu hỏi này. Cuối cùng, tôi đã làm việc từ một số nguồn khác. Đối với những người có thể vẫn muốn nó trả lời, đây là những gì làm việc cho tôi. (Lưu ý - cả min và SDK mục tiêu được đặt thành 15 trong dự án này.)

  1. Dump the PreferenceHeaders, bạn sẽ không cần đến chúng.
  2. Tạo màn hình tùy chọn với cài đặt trang đơn.
  3. Tạo lớp hoạt động tùy chọn (Cài đặtHoạt động bên dưới).
  4. Tạo lớp nội tuyến mở rộng PreferenceFragment (LocationFragment bên dưới).
  5. Xác định lớp trong Tệp kê khai.
  6. Bắt đầu tác vụ - xem mã trình đơn bên dưới.

Lớp tùy chọn hiển thị màn hình cài đặt đơn.

public class SettingsActivity extends PreferenceActivity { 

    private final static String TAG = "SettingsAcitivity"; 

    public SettingsActivity() {} 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     MyLog.d(TAG, "onCreate"); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new LocationFragment()).commit(); 
    } 

    public class LocationFragment extends PreferenceFragment { 

     private final static String TAG = "LocationFragment"; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      MyLog.d(TAG, "onCreate"); 
      addPreferencesFromResource(R.xml.locationsettings); 
     } 
    } 
} 

mã để hiển thị Cài đặt:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    MyLog.d(TAG, "onOptionsItemSelected"); 
    switch (item.getItemId()) { 
    case R.id.menu_main_help: 
     break; 
    case R.id.menu_main_about: 
     break; 
    case R.id.menu_main_settings: 
     MyLog.d(TAG, "Settings"); 
     Intent settingsIntent = new Intent(this, SettingsActivity.class); 
     startActivity(settingsIntent); 
     break; 
    } 
    return true; 
} 

Mấu chốt lại chấm dứt SettingsActivity. Các thói quen ưu tiên dựng sẵn lưu bất kỳ thay đổi nào. Hàm onResume mà tôi có một phương thức getSettings() cập nhật mọi cài đặt đã thay đổi được sử dụng bởi hoạt động gọi (MainActivity trong trường hợp này).

Vậy đó.

+0

Và nếu bạn vẫn nhìn thấy các tiêu đề cũ trên đầu trang Fragmant của bạn, hãy chắc chắn rằng bạn xóa phương thức 'onBuildHeaders()'. – iTurki

77

Cách ưa thích mới là hiển thị một đơn PreferenceFragment làm nội dung chính của bất kỳ hoạt động nào.Nó không cần phải là PreferenceActivity. Xem mẫu bản trình diễn API

public class FragmentPreferences extends Activity { 

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

     // Display the fragment as the main content. 
     getFragmentManager().beginTransaction().replace(android.R.id.content, 
       new PrefsFragment()).commit(); 
    } 


    public static class PrefsFragment extends PreferenceFragment { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.preferences); 
     } 
    } 

} 
+0

Điều này sẽ không hoạt động trên API 11 thấp hơn ... vì phương thức getFragmentManager() được thêm vào API 11. –

+0

getFragmentManager() có thể được gọi nếu bạn sử dụng thư viện hỗ trợ. – TheIT

+0

yup! giải pháp tốt đẹp .. tôi đã không nhận ra rằng PreferenceFragment có thể được sử dụng mà không bị lồng trong PreferenceActivity! ;) –