PreferenceFragment отображается прозрачно

Я пытаюсь показать PreferenceFragment после того, как я выберу параметр "Настройки" в своем ActionBar. Однако после замены текущего содержимого на 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

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

Ответ 1

В конце концов исправлено это с очень простым исправлением.

Я просто назвал PreferenceFragment в новом Intent, и он отлично работал.

Для тех, кто имеет ту же проблему:

Prefs.java

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

На главном экране при нажатии кнопки

Intent i = new Intent(this, Prefs.class);
            startActivity(i);

Это все. После настройки настроек просто нажмите кнопку "Назад", и все будет готово.

Ответ 2

Создайте класс 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);
        }

EDIT:

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

Ответ 3

У меня была та же проблема и она была решена//без необходимости запуска нового действия //. Преимущество этого метода состоит в том, что ваш основной вид деятельности не проходит цикл паузы-возобновления. Ключ состоит в том, чтобы ваш основной пользовательский интерфейс был фрагментом, а затем скрывать его при вызове фрагмента 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>

Ответ 4

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

Что есть:

Добавление следующего кода в ваш 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; }

Ответ 5

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

public void onResume() {
    super.onResume();
    getView().setBackgroundColor(Color.WHITE);
}

Ответ 6

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

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();
    }

Ответ 7

Цвет фона может быть установлен на вид фрагмента в 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));
}

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

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

Ответ 8

Добавьте это в свой фрагмент, который расширяет 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;
}

Ответ 9

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

Внутри моей главной операции было показано следующее:

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

Ответ 10

Я попробовал решение 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> 

Ответ 11

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

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

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