支持Android V14 preferenceFragment崩溃 [英] android support v14 PreferenceFragment crashes

查看:1290
本文介绍了支持Android V14 preferenceFragment崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想显示使用从 android.support.v14。preference 库preferenceFragment在一个Android应用程序的设置。然而,当我尝试打开preferences应用程序崩溃与一个奇怪的NullPointerException异常。这不会发生,如果我离开了呼叫添加preferenceFromResource(R.xml。preferences)在我的preferenceFragment,但随后当然preferences永远不会显示。

 了java.lang.RuntimeException:无法启动活动ComponentInfo {com.hardboard preferencetest / com.hardboard preferencetest.MainActivity。}:显示java.lang.NullPointerException :尝试在空对象引用调用虚拟方法无效android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView $适配器)'
            在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
            在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
            在android.app.ActivityThread.access $ 800(ActivityThread.java:156)
            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1351)
            在android.os.Handler.dispatchMessage(Handler.java:102)
            在android.os.Looper.loop(Looper.java:211)
            在android.app.ActivityThread.main(ActivityThread.java:5373)
            在java.lang.reflect.Method.invoke(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:372)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1020)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
     显示java.lang.NullPointerException:产生的原因尝试在空对象引用调用虚拟方法无效android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView $适配器)'
            在android.support.v14 preference preferenceFragment.bind preferences(preferenceFragment.java:473)。
            在android.support.v14 preference preferenceFragment.onActivityCreated(preferenceFragment.java:278)。
            在android.app.Fragment.performActivityCreated(Fragment.java:2061)
            在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:912)
            在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
            在android.app.BackStackRecord.run(BackStackRecord.java:834)
            在android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
            在android.app.Activity.performStart(Activity.java:6005)
            在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
在android.app.ActivityThread.access $ 800(ActivityThread.java:156)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1351)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:211)
在android.app.ActivityThread.main(ActivityThread.java:5373)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1020)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
 

我读过的支持,V14 preferenceFragment使用RecyclerView内部以显示preferences的名单,但我在做什么错误导致RecyclerView是

我的主要活动:

 公共类MainActivity扩展AppCompatActivity实现SettingsFragment.OnFragmentInteractionListener {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        getFragmentManager()的BeginTransaction()
                .replace(android.R.id.content,新SettingsFragment())
                .addToBackStack(空)
                。承诺();
    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        //充气菜单;这增加了项目操作栏,如果它是present。
        。getMenuInflater()膨胀(R.menu.menu_main,菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        //处理动作栏项目点击这里。将操作栏
        //自动在主/向上按钮操作的点击,只要
        //你在AndroidManifest.xml中指定一个父活动。
        INT的id = item.getItemId();

        // noinspection SimplifiableIfStatement
        如果(ID == R.id.action_settings){
            返回true;
        }

        返回super.onOptionsItemSelected(项目);
    }

    @覆盖
    公共无效onFragmentInteraction(URI URI){

    }
}
 

在preferenceFragment:

 公共类SettingsFragment扩展android.support.v14。preference。preferenceFragment {

    私人OnFragmentInteractionListener mListener;

    公共SettingsFragment(){
        //要求空公共构造
    }

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

    }

    @覆盖
    公共无效的onCreate preferences(捆绑savedInstanceState,串ROOTKEY){
        加preferencesFromResource(R.xml preferences。);
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                             捆绑savedInstanceState){
        //充气的布局该片段
        返回inflater.inflate(R.layout.fragment_settings,集装箱,假);
    }

    // TODO:重命名方法,更新参数,挂钩方法为UI事件
    公共无效onButton pressed(URI URI){
        如果(mListener!= NULL){
            mListener.onFragmentInteraction(URI);
        }
    }

    @覆盖
    公共无效onAttach(上下文的背景下){
        super.onAttach(上下文);
        尝试 {
            mListener =(OnFragmentInteractionListener)范围内;
        }赶上(ClassCastException异常E){
            抛出新ClassCastException异常(context.toString()
                    +必须实现OnFragmentInteractionListener);
        }
    }

    @覆盖
    公共无效onDetach(){
        super.onDetach();
        mListener = NULL;
    }

    公共接口OnFragmentInteractionListener {
        公共无效onFragmentInteraction(URI URI);
    }

}
 

解决方案

A preferenceFragment 已膨胀使用适当的布局 - 用你自己的 R.layout.fragment_settings ,它是不是能够找到它需要相应的意见。

如果你想修改 RecyclerView 本身是重写<一href="https://developer.android.com/reference/android/support/v14/$p$pference/$p$pferenceFragment.html#onCreateRecyclerView(android.view.LayoutInflater,%20android.view.ViewGroup,%20android.os.Bundle)"相对=nofollow> onCreateRecyclerView()。相反,如果你想创建一个围绕默认布局一些自定义的框架,你可以使用一种模式,如:

  @覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
        捆绑savedInstanceState){
    最终的视图中查看= inflater.inflate(R.layout.fragment_settings,集装箱,假);
    //框架要嵌入父布局。
    最后的ViewGroup innerContainer =(ViewGroup中)view.findViewById(R.id.main_frame);
    最后查看innerView = super.onCreateView(充气,innerContainer,savedInstanceState);
    如果(innerView!= NULL){
        innerContainer.addView(innerView);
    }
    返回查看;
}
 

I'm trying to display settings in an Android app using a PreferenceFragment from the android.support.v14.preference library. However, when I try to open the preferences the app crashes with a strange NullPointerException. This doesn't happen if I leave out the call to addPreferenceFromResource(R.xml.preferences) in my the PreferenceFragment, but then of course the preferences never get shown.

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hardboard.preferencetest/com.hardboard.preferencetest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
            at android.app.ActivityThread.access$800(ActivityThread.java:156)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:211)
            at android.app.ActivityThread.main(ActivityThread.java:5373)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
            at android.support.v14.preference.PreferenceFragment.bindPreferences(PreferenceFragment.java:473)
            at android.support.v14.preference.PreferenceFragment.onActivityCreated(PreferenceFragment.java:278)
            at android.app.Fragment.performActivityCreated(Fragment.java:2061)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:912)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
            at android.app.BackStackRecord.run(BackStackRecord.java:834)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
            at android.app.Activity.performStart(Activity.java:6005)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
            at android.app.ActivityThread.access$800(ActivityThread.java:156)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:211)
            at android.app.ActivityThread.main(ActivityThread.java:5373)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

I've read that the support-v14 PreferenceFragment uses a RecyclerView internally to display the list of preferences, but what am I doing wrong to result in the RecyclerView being null?

My main Activity:

public class MainActivity extends AppCompatActivity implements SettingsFragment.OnFragmentInteractionListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .addToBackStack(null)
                .commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
}

The PreferenceFragment:

public class SettingsFragment extends android.support.v14.preference.PreferenceFragment {

    private OnFragmentInteractionListener mListener;

    public SettingsFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_settings, container, false);
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mListener = (OnFragmentInteractionListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }

}

解决方案

A PreferenceFragment already inflates the appropriate layout for use - by using your own R.layout.fragment_settings, it isn't able to find the appropriate views it requires.

If you'd like to modify the RecyclerView itself, consider overriding onCreateRecyclerView(). If instead you want to create some custom framing around the default layout, you can use a pattern such as:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_settings, container, false);
    // The frame you want to embed the parent layout in.
    final ViewGroup innerContainer = (ViewGroup) view.findViewById(R.id.main_frame);
    final View innerView = super.onCreateView(inflater, innerContainer, savedInstanceState);
    if (innerView != null) {
        innerContainer.addView(innerView);
    }
    return view;
}

这篇关于支持Android V14 preferenceFragment崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆