PreferenceFragment отображается прозрачно - PullRequest
12 голосов
/ 03 декабря 2011

Я пытаюсь отобразить PreferenceFragment после того, как выбрал параметр «Настройки» на панели действий. Однако после замены текущего контента на PreferenceFragment вы можете увидеть старый контент под ним. Как в, вы можете видеть прямо через настройки.

Я что-то здесь упускаю? Я использовал пример из своей книги, в которой не было файлов макета для настроек. Вам это нужно?

Используемый код:

Меню панели действий

private boolean MenuChoice(MenuItem item) {
        switch (item.getItemId()) {
        case 0:
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction =
            fragmentManager.beginTransaction();
            ReaderPreferences prefs = new ReaderPreferences();
            fragmentTransaction.replace(android.R.id.content, prefs);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
            return true;

        }
        return false;
    }

PreferenceReader

public class ReaderPreferences extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // --load the preferences from an XML file---
        addPreferencesFromResource(R.xml.preference);
    }
  }

Фактический результат:

enter image description here

Как видите, вы смотрите сквозь мои предпочтения. Что я сделал не так?

Ответы [ 11 ]

8 голосов
/ 16 мая 2014

Создайте свой PreferenceFragment.java класс следующим образом:

    public class UserPreferenceFragment extends PreferenceFragment {

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

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

        getView().setBackgroundColor(Color.BLACK);
        getView().setClickable(true);
    }

}

хитрость:

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

            getView().setBackgroundColor(Color.BLACK);
            getView().setClickable(true);
        }

РЕДАКТИРОВАТЬ:

Отредактировано в соответствии с предложением JDenais, даже если это не является строго необходимым для темы.

6 голосов
/ 04 марта 2015

Лучшее и наиболее портативное решение - здесь

Что такое:

Добавление следующего кода в ваш PreferenceFragment будет позволяет добавить цвет фона, изображение и т. д.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    view.setBackgroundColor(getResources().getColor(android.R.color.your_color));

    return view; }
6 голосов
/ 01 мая 2012

У меня была та же проблема, и я решил ее // без необходимости начинать новую деятельность //.Преимущество этого метода заключается в том, что ваша основная деятельность не проходит цикл паузы-возобновления.Главное, чтобы ваш основной пользовательский интерфейс был фрагментом, а затем скрыть его при вызове Pref-фрагмента.Основной фрагмент может быть включен статически или динамически.

 FragmentTransaction ft = getFragmentManager().beginTransaction();
 AppSettingsFragment prefs = new AppSettingsFragment();
 // This adds the newly created Preference fragment to my main layout, shown below
 ft.add(R.id.main_layout,prefs);
 // By hiding the main fragment, transparency isn't an issue
 ft.hide(mMyMainFragment);
 ft.addToBackStack(null);
 ft.commit();

main_layout.xml выглядит следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- Uncomment for static fragment inclusion -->
<!-- fragment android:name="com.legynd.ui.MyMainFragment"
    android:id="@+id/mainfragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" / -->
</RelativeLayout>
2 голосов
/ 26 декабря 2013

Используйте пустой макет для своей деятельности, например:

activity_settings.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/settingsFragment"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
</FrameLayout>

, затем в onCreate действия:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    ReaderPreferences mReaderPreferences = new ReaderPreferences ();
    getSupportFragmentManager().beginTransaction()
       .replace(R.id.settingsFragment, mReaderPreferences ).commit();
    }
2 голосов
/ 07 августа 2013

В вашей реализации ReaderPreferences добавьте:

public void onResume() {
    super.onResume();
    getView().setBackgroundColor(Color.WHITE);
}
1 голос
/ 13 июня 2015

Добавьте это в свой фрагмент, который расширяет PreferenceFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    view.setBackgroundColor(getResources().getColor(android.R.color.white));
    return view;
}
1 голос
/ 29 мая 2015

Цвет фона может быть установлен на Fragment View в onStart ().Как показано ниже:

public class ReaderPreferences extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preference);
}

@Override
public void onStart() {
   super.onStart();
   View v = getView();
   v.setBackgroundColor(getActivity().getResources.getColor(R.color.my_color));
}

Это работает для меня на всех моих тестовых устройствах.

Принятый ответ не является ответом на то, что здесь говорится в вопросе.Фактически, это обходной путь, который создает контейнерную активность для фрагмента предпочтения.

0 голосов
/ 08 октября 2016

я использовал много техник, но без выгоды
Наконец я исправил это, добавив фон контейнера или макет фрагмента, подобный этому

android:background="@android:color/white"    

, который вам просто нужно добавить в свой макет или вид контейнераФрагмент из вас
Надеюсь, что это поможет

0 голосов
/ 22 марта 2014

Я попробовал решение Shayan_Aryan, но мое приложение умирало с ошибкой:

Your content must have a ListView whose id attribute is 'android.R.id.list'

Поэтому мне пришлось создать LinearLayout без текста в пустом кейсе.Ну, я полагаю, есть более элегантное решение, но это единственное, что сработало для меня.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

<ListView android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

<TextView android:id="@+id/android:empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>
</LinearLayout> 
0 голосов
/ 30 января 2014

Я также застрял с точно такой же проблемой, и после того, как попробовал пару вещей, я обнаружил, что это происходит, потому что в моем случае я перепутал две разные версии Fragments и FragmentManager.

OnCreate моей MainActivity выглядело так:

getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new MainFragment())
                .commit();

Однако, когда я захотел заменить этот MainFragment своим собственным PreferenceFragment, я попытался использовать нечто похожее на то, что вы использовали:

getFragmentManager().beginTransaction()
                    .replace(R.id.container, new SettingsFragment())
                    .addToBackStack(null)
                    .commit();

Насколько я понимаю, вы должны использовать тот же тип FragmentManager для замены для работы, поэтому мне просто нужно было пойти дальше и внести соответствующие изменения в способ, которым я подключил MainFragment, чтобы он выглядел так:

getFragmentManager().beginTransaction()
            .add(R.id.container, new MainFragment())
            .commit();

Конечно, мне пришлось реорганизовать MainFragment для расширения с android.app.Fragment вместо android.support.v4.app.Fragment

...