我已经在我的项目中安装了来自 https://github.com/yarolegovich/MaterialPreferences 的库。我已经成功运行了它,当我使用 ACTIVITY 时它工作正常。但是,我的问题是当我从片段调用 xml 布局时。
这是我的布局xml。
< ? xml version="1.0" encoding="utf-8"? >
< com.yarolegovich.mp.MaterialPreferenceScreen 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:id="@+id/preference_screen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".ui.activities.StartupActivity">
<com.yarolegovich.mp.MaterialPreferenceCategory
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yarolegovich.mp.MaterialSwitchPreference
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_insert_emoticon_black_24dp"
app:mp_key="@string/pkey_use_lovely"
app:mp_title="@string/use_lovely_module" />
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/pref_configs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_settings_black_24dp"
app:mp_title="@string/app_configs" />
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/pref_form"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_supervisor_account_black_24dp"
app:mp_title="@string/fill_the_form" />
</com.yarolegovich.mp.MaterialPreferenceCategory>
< / com.yarolegovich.mp.MaterialPreferenceScreen>
这是我从我的片段中调用它的方式,该片段出错:(
<pre>
package singbiz.posonthego.ui.fragments.pages;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.yarolegovich.lovelyuserinput.LovelyInput;
import com.yarolegovich.mp.io.MaterialPreferences;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.ButterKnife;
import singbiz.posonthego.R;
import singbiz.posonthego.ui.activities.StartupActivity;
//import singbiz.posonthego.ui.fragments.Prefs;
/**
* Created by james on 31/5/16.
*/
public class SettingsFragment extends Fragment implements StartupActivity.EventHandler, View.OnClickListener, SharedPreferences.OnSharedPreferenceChangeListener {
private StartupActivity parentActivity;
private Context context;
@Override
public void handleScanResult(String result) {
}
@Override
public void handleOnPrintResult(int status) {
}
@Override
public List<String> onSearchAutocomplete(String query) {
return null;
}
@Override
public void onSearch(String result) {
}
@Override
public void onSearchStatus(boolean open) {
}
@Override
public void onChildActivityResult(int request_code, int result_code, Intent data) {
}
@Override
public void onPageInit() {
}
@Override
public void onPageRelease() {
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
/*if (key.equals(Prefs.keys().KEY_USE_LOVELY)) {
setUserInputModule(sharedPreferences.getBoolean(key, false));
}*/
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_settings, container, false);
//ButterKnife.bind(this, view);
//initPage();
return view;
}
private void initPage() {
parentActivity = (StartupActivity) getActivity();
parentActivity.setPageTitle(getString(R.string.settings));
context = getContext();
//Prefs.init(context);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);
//setUserInputModule(prefs.getBoolean(Prefs.keys().KEY_USE_LOVELY, false));
}
private void setUserInputModule(boolean shouldUseLovelyModule) {
}
@Override
public void onClick(View v) {
}
@Override
public void onDestroy() {
super.onDestroy();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
}
</pre>
这是例外
<pre>
E/AndroidRuntime: FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #20: Error inflating class com.yarolegovich.mp.MaterialPreferenceCategory
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at singbiz.posonthego.ui.fragments.pages.SettingsFragment.onCreateView(SettingsFragment.java:86)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4794)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at singbiz.posonthego.ui.fragments.pages.SettingsFragment.onCreateView(SettingsFragment.java:86)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4794)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:459)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.view.View.inflate(View.java:16140)
at com.yarolegovich.mp.MaterialPreferenceCategory.init(MaterialPreferenceCategory.java:56)
at com.yarolegovich.mp.MaterialPreferenceCategory.<init>(MaterialPreferenceCategory.java:33)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at singbiz.posonthego.ui.fragments.pages.SettingsFragment.onCreateView(SettingsFragment.java:86)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4794)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:459)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at android.view.View.inflate(View.java:16140)
at com.yarolegovich.mp.MaterialPreferenceCategory.init(MaterialPreferenceCategory.java:56)
at com.yarolegovich.mp.MaterialPreferenceCategory.<init>(MaterialPreferenceCategory.java:33)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at singbiz.posonthego.ui.fragments.pages.SettingsFragment.onCreateView(SettingsFragment.java:86)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4794)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
</pre>
这是材料偏好类别.java
<pre>
package com.yarolegovich.mp;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.CardView;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import static com.yarolegovich.mp.util.Utils.*;
/**
* Created by yarolegovich on 01.05.2016.
*/
public class MaterialPreferenceCategory extends CardView {
private ViewGroup container;
private TextView title;
public MaterialPreferenceCategory(Context context) {
super(context);
init(null);
}
public MaterialPreferenceCategory(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public MaterialPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
int titleColor = -1;
String titleText = "";
if (attrs != null) {
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MaterialPreferenceCategory);
try {
if (ta.hasValue(R.styleable.MaterialPreferenceCategory_mpc_title)) {
titleText = ta.getString(R.styleable.MaterialPreferenceCategory_mpc_title);
}
titleColor = ta.getColor(R.styleable.MaterialPreferenceCategory_mpc_title_color, -1);
} finally {
ta.recycle();
}
}
inflate(getContext(), R.layout.view_preference_category, this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, dpToPixels(getContext(), 4));
setUseCompatPadding(true);
setRadius(0);
container = (ViewGroup) findViewById(R.id.mpc_container);
title = (TextView) findViewById(R.id.mpc_title);
if (!TextUtils.isEmpty(titleText)) {
title.setVisibility(View.VISIBLE);
title.setText(titleText);
}
if (titleColor != -1) {
title.setTextColor(titleColor);
}
}
public void setTitle(String titleText) {
title.setVisibility(View.VISIBLE);
title.setText(titleText);
}
public void setTitleColor(@ColorInt int color) {
title.setTextColor(color);
}
public void setTitleColorRes(@ColorRes int colorRes) {
title.setTextColor(ContextCompat.getColor(getContext(), colorRes));
}
@Override
public void addView(View child) {
if (container != null) {
container.addView(child);
} else {
super.addView(child);
}
}
@Override
public void addView(View child, int index) {
if (container != null) {
container.addView(child, index);
} else {
super.addView(child, index);
}
}
@Override
public void addView(View child, ViewGroup.LayoutParams params) {
if (container != null) {
container.addView(child, params);
} else {
super.addView(child, params);
}
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if (container != null) {
container.addView(child, index, params);
} else {
super.addView(child, index, params);
}
}
}
</pre>
任何帮助或建议不胜感激!附言我没有复制完整的异常,因为它太长了。
试试这段代码:
主要活动5.java
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
public class MainActivity5 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
Fragment1 fragment = new Fragment1();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.container, fragment, "fragment1");
ft.addToBackStack(null);
ft.commit();
}
}
activity_main5.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
片段1.java
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by ManishJ1 on 6/3/2016.
*/
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_f1, container, false);
return rootView;
}
}
fragment_f1.xml
<?xml version="1.0" encoding="utf-8"?>
<com.yarolegovich.mp.MaterialPreferenceScreen 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:id="@+id/preference_screen"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yarolegovich.mp.MaterialPreferenceCategory
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.yarolegovich.mp.MaterialSwitchPreference
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_launcher"
app:mp_key="@string/app_name"
app:mp_title="@string/app_name" />
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/pref_configs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_launcher"
app:mp_title="@string/app_name" />
<com.yarolegovich.mp.MaterialStandardPreference
android:id="@+id/pref_form"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:mp_icon="@drawable/ic_launcher"
app:mp_title="@string/app_name" />
</com.yarolegovich.mp.MaterialPreferenceCategory>
</com.yarolegovich.mp.MaterialPreferenceScreen>