รายการทางเลือกสำหรับ PreferenceFragment ด้วย android-support-v4.0


90

ฉันหยุดการพัฒนาแอปอย่างกะทันหันเนื่องจากฉันตระหนักว่าไม่รองรับ PreferenceFragments ในไลบรารีนี้ มีทางเลือกอื่นที่นักพัฒนา Android มือใหม่สามารถใช้เพื่อเอาชนะอุปสรรคนี้ได้หรือไม่?

นี่คือหน้าต่างหลักของฉัน ณ ตอนนี้

<?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>

สำหรับ TabActivity ของฉันฉันกำลังใช้สิ่งที่พบทางออนไลน์ นี่คือตัวอย่าง:

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*...

มีการใช้งานบางอย่างที่คล้ายกับการตั้งค่าส่วนกำหนดลักษณะ (หรือการกำหนดค่าตามความชอบ) โดยใช้ไลบรารีความเข้ากันได้ของ android-support-v4



ไม่ใช่รายการที่ซ้ำกันจริงๆเนื่องจากฉันอยู่ในสถานการณ์ที่ฉัน "ต้องการ" การตั้งค่าเหล่านี้เพื่อแสดงในโฮสต์แท็บ ดูการแก้ไขของฉัน
CodePrimate

ดูคำตอบของฉันมีการปรับปรุง PreferenceFragmentCompatเพิ่งถูกเพิ่มลงในไลบรารีการสนับสนุน
theblang

คำตอบ:


86

อัพเดท - 6/11/2558

ไลบรารี Support-v7 รวมถึงPreferenceFragmentCompatไฟล์. ดังนั้นจะเป็นความคิดที่ดีกว่าที่จะใช้มัน


เพิ่มโปรเจ็กต์ต่อไปนี้เป็นโปรเจ็กต์ไลบรารีในแอปพลิเคชันของคุณ

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

คุณสามารถเก็บทุกอย่างรวมถึงธุรกรรมส่วนย่อยของคุณได้ตามที่เป็นอยู่ เมื่อนำเข้าPreferenceFragmentคลาสตรวจสอบให้แน่ใจว่าส่วนหัวของการนำเข้าที่ถูกต้องคือผู้ใช้

import android.support.v4.preference.PreferenceFragment;

แทน

import android.preference.PreferenceFragment;

4
ดูเหมือนว่ารหัส github จะมีปัญหาร้ายแรง ... ฉันใช้ไม่ได้RingtonePreferenceและOnSharedPreferenceChangeListenerดูเหมือนจะไม่มีการเปลี่ยนแปลงใด ๆ ด้วย!
madlymad

2
ฉันคิดว่าเป็นความคิดที่ดีที่จะใช้ห้องสมุดนี้ แต่ฉันรู้ว่ามันไม่ดีอย่างที่คิด การพยายามแทนที่onPrepareOptionMenuวิธีการแสดงให้ฉันเห็นลายเซ็นแปลก ๆ (ส่งกลับvoid) แตกต่างจากค่าเริ่มต้นที่เราทุกคนรู้ (ส่งคืนboolean) !!! ปัญหาร้ายแรง
S.Thiongane

9
โหวตเพิ่มและคุณจะได้รับสิทธิ์รับประทานอาหารค่ำฟรีทุกครั้งที่คุณมาที่มาดริด ...
rupps

7
@mansoulx onPrepareOptionsMenu มักจะมีประเภทผลตอบแทนที่เป็นโมฆะในส่วนย่อย (ไม่เหมือนกับกิจกรรมที่เป็นบูลีน) ดังนั้นลายเซ็นนี้จึงเป็นไปตามที่คาดไว้ทั้งหมด
Cumbayah

3
ปัญหาเกี่ยวกับไลบรารีควรได้รับการรายงานในโครงการ github
Mathijs Segers

128

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ตอนนี้คุณสามารถใช้PreferenceFragmentCompatจากcom.android.support:preference-v7:23.3.0


4
เยี่ยมมากนี่คือหนึ่งในคำตอบที่ถูกต้องในตอนนี้
Mythul

สำหรับฉันมันใช้งานได้กับ com.android.support:preference-v7:23.0.1 เท่านั้น
Felipe Mosso

1
ดูเหมือนว่าจะไม่ได้อยู่บนเซิร์ฟเวอร์อ้างอิงเมื่อพยายามเพิ่มจาก Android Studio ฉันต้องเพิ่มที่เก็บหรือไม่
Brill Pappin

ไม่มีคลาสนั้น
JJ Ab

1
ฉันตั้งใจ upvoted คำตอบนี้และผมก็ไม่สามารถยกเลิกได้ในขณะนี้เพื่อแทนฉันเพิ่งจะทราบว่าPreferenceFragmentCompatมีประเด็นสำคัญบางอย่างเห็นนี้และนี้รายงานข้อผิดพลาดเช่นและอื่น ๆ อีกมากมายที่นี่ ฉันลงเอยด้วยการเลิกใช้งานPreferenceActivityแทน ถอนหายใจ
Vicky Chijwani

16

การปรับปรุงที่สำคัญ: แก้ไขล่าสุดในv7 support libraryขณะนี้มีชาวPreferenceFragmentCompat

ฉันใช้ห้องสมุดนี้ซึ่งมีAARในเพื่อให้คุณสามารถรวมไว้ถ้าคุณกำลังใช้mavenCentralGradle

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


คุณช่วยแชร์วิธีการนำเข้าและขยายส่วนสนับสนุนได้อย่างไร ขอบคุณ
สตีเวน

1
@ สตีฟชัวร์! ฉันทำสรุปสาระสำคัญ
theblang

@mattblang ขอบคุณมาก!
Steven

@mattblang ขอบคุณมาก ... ความช่วยเหลือของคุณช่วยประหยัดเวลาของฉันได้มาก
Asad Ullah Rafiq

ข้อยกเว้น java.lang.RuntimeException: เนื้อหามีมุมมองที่มีแอตทริบิวต์ id 'android.R.id.list' ที่ไม่ใช่คลาส ListView
Abdul Rahman

10

PreferenceFragmentคุณสามารถใช้ของตัวเอง

มันง่ายและฉันก็ไม่มีปัญหากับมันเลย ฉันคิดว่าคุณสามารถแสดงได้ครั้งละหนึ่งรายการเท่านั้นในกิจกรรมเดียวซึ่งน่าจะใช้ได้


9

Preferences Support Library: Preference Fragments สำหรับ API 7+ ไม่ว่าจะเป็นกิจกรรมใดก็ตาม

การใช้งานอย่างง่ายจะรวมถึง PreferenceFragmentCompat เช่น:

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

คุณจะต้องตั้งค่ากำหนดธีมในธีมของคุณด้วย:

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

และเพิ่มสิ่งนี้ในการอ้างอิง: http://developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0

7

คุณอาจใช้กิจกรรมจริงและใช้ส่วนย่อย แต่ฉันไม่คิดว่าเป็นทางเลือกที่ดี คุณควรใช้ PreferenceActivity อย่างง่ายและรอการปรับปรุงใน retro compat libs


1
ฉันไม่สามารถใช้ PreferenceActivity ได้เนื่องจากแอปที่เหลือของฉันประกอบด้วยแท็บวิดเจ็ต ส่วนการตั้งค่าควรจะแสดงเหนือแท็บวิดเจ็ต ฉันต้องทำให้มันเป็นกิจกรรมแทนมันจะขึ้นทั้งหน้าจอ
CodePrimate

2
จากนั้นใช้ส่วนของรายการที่กำหนดเอง
zapl


0

คุณสามารถขยายจากPreferenceActivityแทนและหากคุณต้องการมี ActionBar คุณสามารถเพิ่มได้โดยใช้Toolbarโดยอยู่เหนือ ListView ที่ใช้สำหรับการตั้งค่า

ซึ่งสามารถทำได้โดยใช้ LinearLayout แนวตั้งซึ่งถือ Toolbar และ ListView กับหุ่นยนต์: id = "@ หุ่นยนต์: ID / รายการ"

หากคุณต้องการคุณสามารถดูวิธีการแก้ปัญหาของฉันที่นี่


0

ดังที่ Lucius กล่าวว่าคุณสามารถใช้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);
       }
}

คุณต้องรวมการพึ่งพาใน gradle:

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

วิธีนี้คุณยังสามารถใช้ FragmentTransaction ของ android.support.v4.app.FragmentTransaction และ PrefernceFragment อย่างไรก็ตามคุณอาจมีปัญหากับธีม หากเป็นกรณีนี้คุณสามารถแก้ไขได้โดยคำนึงถึงโพสต์นี้:

โซลูชันเพื่อให้ lib ทำงานบน API 7+ ในขณะที่คงธีมวัสดุไว้บน API 14+

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.