2012-06-07 28 views
39

Tôi đang thực hiện một ứng dụng Android sử dụng ActionBarSherlock. Vấn đề của tôi là tạo màn hình tùy chọn. Phương thức onBuildHeader() trên lớp SherlockPreferenceActivity được gọi là nerver.Tùy chọn màn hình bằng cách sử dụng ActionBar Sherlock

Đây là mã của tôi

preference_headers.xml

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" > 
<header 
    android:fragment="package.fragments.MyPreferenceFragment" 
    android:icon="@drawable/bulle" 
    android:summary="An example of some preferences." 
    android:title="title" /> 

</preference-headers> 

preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
    android:title="@string/options" > 

    <PreferenceCategory> 
     <SwitchPreference 
      android:id="@+id/cb_notif" 
      android:defaultValue="false" 
      android:key="com.vincent.HTC_Dev.pref.notif" 
      android:summaryOff="@string/notifications_off" 
      android:summaryOn="@string/notifications_on" 
      android:title="@string/notifications" /> 
    </PreferenceCategory> 

</PreferenceScreen> 

MyPreferenceActivity

public class MyPreferenceActivity extends SherlockPreferenceActivity { 


    @Override 
    public void onBuildHeaders(List<Header> target) { 
     super.onBuildHeaders(target); 

     loadHeadersFromResource(R.xml.preference_headers, target); 
    } 

} 

MyPreferenceFragment

public class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { 

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

     addPreferencesFromResource(R.xml.preferences); 
     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     // TODO Auto-generated method stub 

    } 


} 
+27

'onBuildHeaders()' sẽ chỉ được gọi nếu bạn đang chạy trên API cấp 11 trở lên. Xem https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC để biết ví dụ về hỗ trợ 'PreferenceFragment' trên API cấp 11+ và tùy chọn cổ điển trên các phiên bản Android cũ hơn. – CommonsWare

+0

OK cảm ơn rất nhiều! –

+11

@CommonsWare Bạn có thể biến nhận xét của mình thành câu trả lời không, bởi vì đây là câu hỏi "chưa được trả lời" được bỏ phiếu cao nhất – rds

Trả lời

3

onBuildHeaders() sẽ chỉ được gọi nếu bạn đang chạy trên API cấp 11 trở lên. Xem github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC để biết ví dụ về hỗ trợ PreferenceFragment trên API cấp 11+ và tùy chọn cổ điển trên các phiên bản Android cũ hơn.
- CommonsWare 07 tháng 6 '12 tại 11:06

@CommonsWare bạn có thể xin vui lòng gửi này như bạn trả lời, vì vậy tôi có thể xóa bản sao này của câu trả lời của bạn.

10

onBuildHeaders() sẽ chỉ được gọi nếu bạn đang chạy trên API cấp 11 trở lên. Trên các thiết bị cũ hơn, bạn quay lại phương pháp cổ điển addPreferencesFromResource().

Xem this sample project để biết ví dụ về hỗ trợ PreferenceFragment trên API cấp 11+ và tùy chọn cổ điển trên các phiên bản Android cũ hơn.

Cụ thể, SherlockFragmentActivity của nó trông giống như:

package com.commonsware.android.preffragsbc; 

import java.util.List; 
import android.os.Build; 
import android.os.Bundle; 
import com.actionbarsherlock.app.SherlockPreferenceActivity; 

public class EditPreferences extends SherlockPreferenceActivity { 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB) { 
     addPreferencesFromResource(R.xml.preferences); 
     addPreferencesFromResource(R.xml.preferences2); 
    } 
    } 

    @Override 
    public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.xml.preference_headers, target); 
    } 
} 

Trong onCreate() chúng ta cần phải chỉ làm addPreferencesFromResource()nếu chúng tôi đang trên một thiết bị cũ. Trong trường hợp này, mẫu của tôi có hai tiêu đề tùy chọn và do đó, hai tệp XML tùy chọn, vì vậy chúng tôi gọi addPreferencesFromResource() trên cả hai. Trên các thiết bị mới hơn, onCreate() không có gì ngoài chuỗi vào siêu lớp, sẽ kích hoạt cuộc gọi đến onBuildHeaders().

Các vấn đề liên quan