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"
вам просто нужно добавить в свой макет или представление контейнера для вас. Фрагмент
Надеюсь, что это поможет.