android-support-v4를 사용하는 PreferenceFragment의 대안


90

PreferenceFragments가이 라이브러리에서 지원되지 않는다는 것을 깨달았 기 때문에 내 앱 개발이 갑자기 중단되었습니다. 신인 안드로이드 개발자가이 장애물을 극복하기 위해 사용할 수있는 대안이 있습니까?

지금의 메인 창입니다.

<?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 호환성 라이브러리를 사용하여 preferencefragment (또는 preferenceActivity)와 유사한 것을 구현할 수 있습니까?



탭 호스트 내에서 이러한 기본 설정을 표시해야하는 상황에 있기 때문에 실제로는 중복되지 않습니다. 내 편집보기
CodePrimate 2012 년

내 업데이트 된 답변을 참조하십시오 . PreferenceFragmentCompat최근 지원 라이브러리에 추가되었습니다.
theblang

답변:


86

업데이트-2015 년 6 월 11 일

Support-v7 라이브러리에는 이제 PreferenceFragmentCompat. 그래서 그것을 사용하는 것이 더 나은 아이디어가 될 것입니다.


다음 프로젝트를 라이브러리 프로젝트로 애플리케이션에 추가하십시오.

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

조각 트랜잭션을 포함한 모든 것을 그대로 유지할 수 있습니다. PreferenceFragment클래스를 가져올 때 올바른 가져 오기 헤더가 user인지 확인하십시오.

import android.support.v4.preference.PreferenceFragment;

대신에

import android.preference.PreferenceFragment;

4
그 github 코드에 심각한 문제가있는 것 같습니다 ... 사용할 수없고 변경 사항 RingtonePreferenceOnSharedPreferenceChangeListener없는 것 같습니다!
madlymad

2
이 라이브러리를 사용하는 것이 좋은 생각이라고 생각했습니다. 하지만 생각만큼 좋지 않다는 걸 깨달았습니다. onPrepareOptionMenu메서드 를 재정의하려고하면 void우리 모두가 알고있는 기본 서명 (반환 )과 다른 이상한 서명 (반환 boolean)이 표시됩니다 !!! 심각한 문제입니다.
S.Thiongane 2014

9
upvoted, 그리고 당신은 마드리드에 올 때마다 무료 저녁 식사를받을 자격이 있습니다 ...이 문제는 나를 미치게 만들었습니다!
rupps

7
@mansoulx onPrepareOptionsMenu는 항상 조각에 void 반환 유형을 가지므로 (부울 인 활동과 달리)이 서명은 전적으로 예상대로입니다.
Cumbayah 2014

3
라이브러리 문제는 github 프로젝트에보고되어야합니다.
Mathijs SEGERS

128

나는 이것이 오래된 질문이라는 것을 알고 있지만 이제 다음에서 사용할 수 PreferenceFragmentCompat있습니다.com.android.support:preference-v7:23.3.0


4
위대한 발견, 이것은 지금 정답 중 하나입니다.
Mythul 2015 년

나를 위해 그것은 com.android.support:preference-v7:23.0.1에서만 작동합니다.
Felipe Mosso

1
Android Studio에서 추가하려고 할 때 종속성 서버에없는 것 같습니다. 저장소를 추가해야합니까?
Brill Pappin 2015

이 클래스가 포함되어 있지 않습니다
JJ Ab의

1
실수로이 답변을 upvoted하고 그래서 대신 내가 그냥주의거야, 지금 취소 할 수 없습니다 PreferenceFragmentCompat몇 가지 주요 문제가 있습니다 : 볼 , 예를 들어 버그 보고서를, 그리고 더 여기 많은 . PreferenceActivity대신 deprecated를 사용 했습니다. 한숨
비키 Chijwani에게

16

중요 업데이트 : 최신 버전v7 support library지금은 기본이 PreferenceFragmentCompat을 .

이 라이브러리를 사용하고 있습니다. 이 라이브러리 에는 인 AARmavenCentral있으므로 사용중인 경우 쉽게 포함 할 수 있습니다 Gradle.

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


지원 조각을 가져오고 확장하는 방법을 공유 할 수 있습니까? 감사합니다
Steven

1
@Steve 물론입니다! 나는 요점을 만들었다 .
theblang dec.

@mattblang 감사합니다!
Steven

많이 ... 당신의 도움이 정말 시간 내 많은 저장 @mattblang 감사합니다
아사드 Ullah 라 피크

예외 java.lang.RuntimeException : 콘텐츠에 ListView 클래스가 아닌 id 속성 'android.R.id.list'가있는보기가 있습니다.
Abdul Rahman

10

내 자신을 사용할 수 있습니다 PreferenceFragment.

간단하고 지금까지 아무런 문제가 없었습니다. 하나의 활동에서 한 번에 하나만 표시 할 수 있다고 생각합니다.


9

기본 설정 지원 라이브러리 : 활동에 관계없이 API 7 이상에 대한 기본 설정 조각

간단한 구현에는 다음과 같은 PreferenceFragmentCompat이 포함됩니다.

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

테마에서 preferencesTheme도 설정해야합니다.

<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를 사용할 수 없습니다. preferencefragment는 tabwidget 위에 표시되어야합니다. 대신 전체 화면을 차지하는 활동으로 만들려고했습니다.
CodePrimate 2012 년

2
그런 다음 몇 가지 사용자 지정 목록 조각 사용
zapl


0

대신 PreferenceActivity 에서 확장 할 수 있으며 ActionBar를 원할 경우 도구 모음 을 사용하여 환경 설정에 사용되는 ListView 위에 추가 할 수 있습니다 .

이것은 툴바와 android : id = "@ android : id / list" 와 함께 ListView를 보유하는 수직 LinearLayout을 사용하여 수행 할 수 있습니다 .

원하는 경우 여기에서 내 솔루션을 볼 수 있습니다 .


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,...)
...
}

이렇게하면 android.support.v4.app.FragmentTransaction 및 PrefernceFragment의 FragmentTransaction을 사용할 수도 있습니다. 그러나 테마에 문제가있을 수 있습니다. 이 경우이 게시물을 고려하여 해결할 수 있습니다.

API 14+에서 머티리얼 테마를 유지하면서 API 7+에서 lib가 작동하도록하는 솔루션

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.