片段项目不会折叠
Posted
技术标签:
【中文标题】片段项目不会折叠【英文标题】:Fragment item won't collapse 【发布时间】:2017-06-17 03:20:13 【问题描述】:我试图在片段中切换我的 1 个形状的可见性,但是当我单击 SwitchPreferenceCompat 控件并返回到我加载的片段时它不起作用。在我运行应用程序之前和期间也没有出现任何错误或警告。这是我的代码:
fragment_blueshapes.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<View
android:id="@+id/blue_square"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:background="@drawable/shape_blue_square" />
<View
android:id="@+id/blue_circle"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:background="@drawable/shape_blue_circle"
android:layout_marginBottom="20dp"
android:layout_below="@id/blue_square"/>
<View
android:id="@+id/blue_rectangle"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:background="@drawable/shape_blue_rectangle"
android:layout_below="@id/blue_circle"/>
</RelativeLayout>
SettingsActivity.java
public class SettingsActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PreferencesFragment newFragment = new PreferencesFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.master_container, newFragment);
transaction.commit();
PreferencesFragment.java
public class PreferencesFragment extends PreferenceFragmentCompat
/**
* @inheritDoc
*/
@Override
public void onCreatePreferences(Bundle bundle, String s)
addPreferencesFromResource(R.xml.app_preferences);
xml/app_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="pref_pref1"
android:title="@string/preferences_switch_title"
android:summary="@string/preferences_switch_summary"
android:layout="@layout/preference_multiline"/>
</android.support.v7.preference.PreferenceScreen>
preference_keys.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pref_pref1" translatable="false">pref_pref1</string>
</resources>
strings.xml
<resources>
<string name="app_name">Shapes</string>
<string name="preferences_switch_title">Show squares</string>
<string name="preferences_switch_summary">This preference applies to all square shapes</string>
</resources>
设置页面截图
BlueShapesActivity.java
public class BlueShapesActivity extends AppCompatActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_shapes);
if (savedInstanceState == null)
FragmentBlueShapes newFragment = new FragmentBlueShapes();
FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detail_container, newFragment);
transaction.commit();
FragmentBlueShapes.java
public class FragmentBlueShapes extends android.support.v4.app.Fragment
public FragmentBlueShapes()
boolean squareState;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
return inflater.inflate(R.layout.fragment_blueshapes, container, false);
@Override
public void onResume()
super.onResume();
loadPreferences();
displaySettings(getView());
public void loadPreferences()
SharedPreferences pref = this.getActivity().getSharedPreferences("settings", Context.MODE_PRIVATE);
squareState = pref.getBoolean("square_state", true);
public void displaySettings(View rootView)
if (squareState)
rootView.findViewById(R.id.blue_square).setVisibility(View.VISIBLE);
else
rootView.findViewById(R.id.blue_square).setVisibility(View.GONE);
当前结果
预期结果
【问题讨论】:
可以发一下布局文件fragment_blueshapes.xml
吗?
发布您的res/layout/activity_settings.xml
【参考方案1】:
首先建议请遵循 android 编码标准,因为这样可以解决您的很多问题,对于 Sharedpreferences https://medium.com/@ali.muzaffar/android-sharedpreferences-singleton-to-make-life-easier-f1d802b6cd8e,请尝试使用单例模式,并且永远不要对您的常量进行硬编码,创建一个类 Constants.class 并将您的所有常量放在那里更容易维护。
编辑 1:
一旦你改变了 SwitchPreferenceCompat 的值,你就可以在应用程序的任何地方访问它,像这样改变你的 loadPreferences 方法。
private void loadPreferences()
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
squareState = sharedPreferences.getBoolean("pref_pref1", false);
【讨论】:
刚刚尝试过,但仍然没有任何区别。你提到的是一个错误,我在你发布答案之前就注意到并纠正了。 我只复制粘贴了您的代码并创建了这个演示,请看一下。 github.com/reyanshmishra/***-demo 我已经按照this tutorial 更改了我的代码,因为它正确地遵循了 Android 指南,而我之前使用的代码没有。请查看我更新的代码(尤其是 PreferencesFragment.java、SettingsActivity.java、xml/app_preferences.xml、preference_keys。 xml,strings.xml)并根据需要编辑您的答案,以便它回答并解决我更新的问题。 你从哪里得到mContext
?
我认为您刚刚开始使用 android check 编辑的答案。以上是关于片段项目不会折叠的主要内容,如果未能解决你的问题,请参考以下文章
具有多个拆分导航的 Bootstrap 4 Navbar 不会折叠