Các lựa chọn thay thế cho PreferenceFragment với android-support-v4


90

Tôi đã đột ngột dừng quá trình phát triển ứng dụng của mình khi tôi nhận ra rằng PreferenceFragment không được hỗ trợ trong thư viện này. Có bất kỳ lựa chọn thay thế nào mà một nhà phát triển Android mới có thể sử dụng để vượt qua trở ngại này không?

Đây là cửa sổ chính của tôi kể từ bây giờ

<?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">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

                <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            />

</TabHost>
</LinearLayout>

Đối với TabActivity của tôi, tôi đang sử dụng thứ gì đó tôi tìm thấy trực tuyến. Đây là một đoạn mã:

public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener 
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;

private class TabInfo {
     private String tag;
     private Class clss;
     private Bundle args;
     private Fragment fragment;
     TabInfo(String tag, Class clazz, Bundle args) {
         this.tag = tag;
         this.clss = clazz;
         this.args = args;
     }

}

class TabFactory implements TabContentFactory 
{

    private final Context mContext;

    /**
     * @param context
     */
    public TabFactory(Context context) {
        mContext = context;
    }

    /** (non-Javadoc)
     * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
     */
    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

...*snip*...

Có cách nào để triển khai thứ gì đó tương tự như phân mảnh tùy chọn (hoặc tùy chọn Hoạt động) bằng cách sử dụng thư viện tương thích android-support-v4 không?



Không thực sự là một bản sao vì tôi đang ở trong tình huống mà tôi "cần" những tùy chọn này được hiển thị trong máy chủ tab. Xem bản chỉnh sửa của tôi
CodePrimate

Xem câu trả lời cập nhật của tôi . PreferenceFragmentCompatgần đây đã được thêm vào thư viện hỗ trợ.
theblang,

Câu trả lời:


86

CẬP NHẬT - 6/11/2015

Thư viện Support-v7 hiện bao gồm PreferenceFragmentCompat. Vì vậy, nó sẽ là một ý tưởng tốt hơn để sử dụng nó.


Thêm dự án sau làm dự án thư viện vào ứng dụng của bạn.

https://github.com/kolavar/android-support-v4-preferencefragment

Bạn có thể giữ nguyên mọi thứ bao gồm cả giao dịch phân mảnh của mình. Khi nhập PreferenceFragmentlớp, hãy đảm bảo rằng tiêu đề nhập chính xác là người dùng.

import android.support.v4.preference.PreferenceFragment;

thay vì

import android.preference.PreferenceFragment;

4
Mã github đó dường như có vấn đề nghiêm trọng ... Tôi không thể sử dụng RingtonePreferenceOnSharedPreferenceChangeListenerdường như không nhận được bất kỳ thay đổi nào!
madlymad

2
Tôi đã nghĩ rằng đó là một ý kiến ​​hay khi sử dụng thư viện này. Nhưng tôi nhận ra rằng nó không tốt như tôi nghĩ. Cố gắng ghi đè onPrepareOptionMenuphương thức cho tôi thấy một chữ ký lạ (trả về void) khác với chữ ký mặc định mà chúng ta đều biết (trả về boolean) !!! một vấn đề nghiêm trọng.
S.Thiongane

9
ủng hộ và bạn có quyền thưởng thức bữa tối miễn phí bất cứ khi nào bạn đến Madrid ... vấn đề này khiến tôi phát điên!
rupps

7
@mansoulx onPrepareOptionsMenu luôn có kiểu trả về vô hiệu trên các đoạn (không giống như đối với Hoạt động, mà nó là boolean), vì vậy chữ ký này hoàn toàn như mong đợi.
Cumbayah

3
Các vấn đề với thư viện có lẽ nên được báo cáo trên dự án github.
Mathijs Segers

128

Tôi biết đây là một câu hỏi cũ, nhưng bây giờ bạn có thể sử dụng PreferenceFragmentCompattừcom.android.support:preference-v7:23.3.0


4
Tìm thấy tuyệt vời, đây là một trong những câu trả lời chính xác ngay bây giờ.
Mythul

Đối với tôi, nó chỉ hoạt động với com.android.support:preference-v7:23.0.1.
Felipe Mosso

1
Điều này dường như không xảy ra trên các máy chủ phụ thuộc khi cố gắng thêm nó từ Android Studio. Tôi có cần thêm kho lưu trữ cho nó không?
Brill Pappin

Nó không chứa lớp đó
JJ Ab

1
Tôi đã vô tình ủng hộ câu trả lời này và tôi không thể hoàn tác nó ngay bây giờ, vì vậy thay vào đó, tôi sẽ chỉ lưu ý rằng PreferenceFragmentCompatcó một số vấn đề chính: ví dụ : xem điều này và báo cáo lỗi này , và nhiều vấn đề khác ở đây . Tôi đã kết thúc bằng cách PreferenceActivitythay thế không dùng nữa . thở dài
Vicky Chijwani

16

Cập nhật quan trọng: Các phiên bản mới nhất của v7 support librarybây giờ có một nguồn gốc PreferenceFragmentCompat .

Tôi đang sử dụng thư viện này , trong đó có một AARtrong mavenCentral, do đó bạn có thể dễ dàng đưa nó nếu bạn đang sử dụng Gradle.

compile 'com.github.machinarius:preferencefragment:0.1.1'


Bạn có thể chia sẻ cách bạn nhập và mở rộng phân đoạn hỗ trợ không? Cảm ơn
Steven

1
@Steve Chắc chắn! Tôi đã làm một Gist .
theblang

@mattblang Cảm ơn rất nhiều!
Steven

@mattblang Thanks a lot ... giúp đỡ của bạn thực sự tiết kiệm rất nhiều thời gian của tôi
Asad Ullah Rafiq

Ngoại lệ java.lang.RuntimeException: Nội dung có quan điểm với thuộc tính id 'android.R.id.list' đó không phải là một lớp ListView
Abdul Rahman

10

Bạn có thể sử dụng của riêng tôi PreferenceFragment.

Nó đơn giản và tôi không có vấn đề gì với nó cho đến nay. Tôi nghĩ rằng bạn chỉ có thể hiển thị một trong số chúng tại một thời điểm trong một Hoạt động duy nhất, điều này sẽ ổn.


9

Thư viện hỗ trợ tùy chọn: Phân đoạn tùy chọn cho API 7+, bất kể Hoạt động

Một triển khai đơn giản sẽ bao gồm một PreferenceFragmentCompat, chẳng hạn như:

public class PreferencesFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

Bạn cũng sẽ cần đặt tùy chọn Chủ đề trong chủ đề của mình:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

Và thêm điều này vào các phần phụ thuộc: http://developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0

7

Bạn có thể sử dụng một hoạt động thực và sử dụng phân mảnh, nhưng tôi không nghĩ đó là một lựa chọn tốt. Bạn nên sử dụng PreferenceActivity đơn giản và chờ đợi những cải tiến trong các lib compat retro.


1
Tôi không thể sử dụng PreferenceActivity vì phần còn lại của ứng dụng của tôi bao gồm một tabwidget. Phân mảnh ưu tiên phải được hiển thị phía trên tabwidget. Tôi đã biến nó thành một hoạt động thay vì nó sẽ chiếm toàn bộ màn hình.
CodePrimate

2
Sau đó, sử dụng một số phân đoạn danh sách tùy chỉnh
zapl

2

Bạn có thể sử dụng các thư viện của bên thứ ba như UnifiedPreferences để sử dụng một API duy nhất cho tất cả các phiên bản Android.


0

Thay vào đó, bạn có thể mở rộng từ PreferenceActivity , và nếu bạn muốn có ActionBar, bạn có thể thêm nó bằng Thanh công cụ như ở trên ListView được sử dụng cho các tùy chọn.

Điều này có thể được thực hiện bằng cách sử dụng LinearLayout dọc giữ Thanh công cụ và ListView với android: id = "@ android: id / list" .

Nếu bạn muốn, bạn có thể xem giải pháp của tôi ở đây .


0

Như Lucius đã nói, bạn có thể sử dụng PreferenceFragmentCompat :

public class MyPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle bundle, String s) {               
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
            addPreferencesFromResource(R.xml.preferences);
       }
}

Bạn phải bao gồm sự phụ thuộc của nó trong gradle:

dependencies {
...
    compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...)
...
}

Bằng cách này, bạn cũng có thể sử dụng FragmentTransaction của android.support.v4.app.FragmentTransaction và PrefernceFragment. Tuy nhiên, bạn có thể gặp vấn đề với các chủ đề. Nếu đúng như vậy, bạn có thể giải quyết nó bằng cách tính đến bài đăng này:

Giải pháp để làm cho lib hoạt động trên API 7+ trong khi vẫn giữ chủ đề material trên API 14+

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.