【发布时间】:2016-03-11 06:10:06
【问题描述】:
我正在尝试实现从 AppCompatActivity(或常规 Activity)加载的 PreferenceFragment,我似乎已将其放入首选项片段的 onCreate 方法,但屏幕显示为空白。下面是一张图片:
我感觉片段在布局后面加载,但我不知道如何检查这一点,因为即使我在具有单个 FrameLayout 的空 Activity 布局上运行它也会得到类似的行为。我正在尝试使用 onOptionSelected() 从我的 Main 中显示设置页面。
我已经坚持了一周,我找到的答案都没有帮助,非常感谢任何帮助!
这是我的活动代码:
public class genericActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(Main.appTAG, "onCreate: settings activity");
setContentView(R.layout.activity_generic);
// IF intent message == settings
final Fragment settingsFragment = new SettingsFragment();
getFragmentManager()
.beginTransaction()
.replace(R.id.fragmentParent, settingsFragment)
.addToBackStack(null)
.commit();
getFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
getFragmentManager()
.beginTransaction()
.remove(settingsFragment)
.commit();
}
});
}
}
Activity的Layout,即activity_generic.xml如下
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.thesis.deefunkt.thesispractise.genericActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/fragmentParent"
android:fitsSystemWindows="true">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list">
</ListView>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
我真的不需要兼容性功能,因为这个屏幕所做的只是设置,但为了保持一致的外观而保留它。
我的 SettingsFragment 代码如下:
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
Log.d(Main.appTAG, "onCreate: SettingsFragment ");
}
}
在运行时,我有一堆我不知道如何解释的日志条目:
D/com.deefunkt.UsbComms: onCreate: settings activity
D/PhoneWindow: *FMB* installDecor mIsFloating : false
D/PhoneWindow: *FMB* installDecor flags : -2139029248
D/AbsListView: Get MotionRecognitionManager
D/Activity: performCreate Call Injection manager
W/Resources: Converting to string: TypedValue{t=0x10/d=0x2580 a=-1}
W/Resources: Converting to string: TypedValue{t=0x10/d=0x8 a=-1}
W/Resources: Converting to string: TypedValue{t=0x10/d=0x1 a=-1}
W/Resources: Converting to string: TypedValue{t=0x10/d=0x0 a=-1}
D/com.deefunkt.UsbComms: onCreate: SettingsFragment
I/InjectionManager: dispatchPreferences > Target : com.thesis.deefunkt.thesispractise.SettingsFragment
D/AbsListView: Get MotionRecognitionManager
I/InjectionManager: dispatchOnViewCreated > Target : com.thesis.deefunkt.thesispractise.SettingsFragment isFragment :true
I/InjectionManager: dispatchOnViewCreated > Target : com.thesis.deefunkt.thesispractise.genericActivity isFragment :false
D/SecWifiDisplayUtil: Metadata value : SecSettings2
D/PhoneWindow: *FMB* isFloatingMenuEnabled mFloatingMenuBtn : null
D/PhoneWindow: *FMB* isFloatingMenuEnabled return false
D/SRIB_DCS: log_dcs ThreadedRenderer::initialize entered!
D/mali_winsys: new_window_surface returns 0x3000, [1440x2560]-format:1
D/OpenGLRenderer: endAllStagingAnimators on 0x7f65c06600 (RippleDrawable) with handle 0x7f74cff540
如您所见,片段内的 onCreate 方法被调用,但我不知道如何处理这些日志数据。
提前致谢!
【问题讨论】:
-
使用 FrameLayout 来膨胀 Fragment,而不是 Activity 的根布局。另外,请使用 PreferenceFragmentCompat,因为您使用的是 AppCompatActivity
-
抱歉,您是说我应该使用 FrameLayout(但在 activity_generic.xml 中)而不是使用 LinearLayout,还是应该创建一个新的 xml 文件,其中包含一个 FrameLayout?我想既然我们已经定义了包含 xml 文件的首选项对象,那就是片段使用的布局,我们只是传递一个容器来放入它?
-
您将不得不重构您的代码...如果您使用的是 Fragments,那么 Activity 布局中不应有任何内容,而不是在 Fragments 膨胀的地方放置一个 FrameLayout @ 987654322@
标签: android android-layout android-fragments android-support-library android-support-design