首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException in FragmentTransaction

NullPointerException in FragmentTransaction
EN

Stack Overflow用户
提问于 2016-08-17 12:28:39
回答 1查看 624关注 0票数 0

我有一个框架输出和一个LinearLayout在MainActivity布局。线性布局由7幅图像组成。我要在点击这些图片的时候换一些片段。在其中一个片段中,我从json获得值,并将它们添加到2个旋转器中。当我第一次将片段从这个片段更改为任何其他片段时,它工作得很好。但是,当我第二次回到这个片段,然后改变片段,应用程序崩溃与NPE。我的MainActivity是不是做错了什么?

Logcat:

代码语言:javascript
复制
FATAL EXCEPTION: main
Process: com.rishta.rishtabliss, PID: 26506
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
at android.view.LayoutInflater.from(LayoutInflater.java:228)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:178)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:163)
at com.rishta.rishtabliss.fragment.FragmentTwo$1.onResponse(FragmentTwo.java:81)
at com.rishta.rishtabliss.fragment.FragmentTwo$1.onResponse(FragmentTwo.java:64)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

activity_main.xml

代码语言:javascript
复制
<?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:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".activity.MainActivity">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/llfooter"
                android:background="#ffffff"
                android:layout_alignParentBottom="true"
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="45dp">

                <ImageView
                    android:id="@+id/img1"
                    android:layout_weight="1"
                    android:src="@drawable/number_one"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img2"
                    android:layout_weight="1"
                    android:src="@drawable/number_two"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img3"
                    android:layout_weight="1"
                    android:src="@drawable/number_three"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img4"
                    android:layout_weight="1"
                    android:src="@drawable/number_four"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img5"
                    android:layout_weight="1"
                    android:src="@drawable/number_five"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img6"
                    android:layout_weight="1"
                    android:src="@drawable/number_six"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>
                <ImageView
                    android:id="@+id/img7"
                    android:layout_weight="1"
                    android:src="@drawable/number_seven"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="selectFrag"/>

            </LinearLayout>

            <FrameLayout
                android:id="@+id/frame_main"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentTop="true"
                android:layout_above="@+id/llfooter" />

        </RelativeLayout>
    </android.support.design.widget.CoordinatorLayout>

主要活动:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (findViewById(R.id.frame_main) != null) {
            if (savedInstanceState != null) {
                return;
            }

            FragmentOne firstFragment = new FragmentOne();
            getSupportFragmentManager().beginTransaction().add(R.id.frame_main, firstFragment).commit();
        }


    } //End OnCreate Method


    public void selectFrag(View view) {
        FragmentManager fm = getSupportFragmentManager();

        Fragment currentFragment = fm.findFragmentById(R.id.frame_main);
        Fragment newFragment = null;

        switch (view.getId()) {
            case R.id.img1:
                if (currentFragment instanceof FragmentOne) {
                    return;
                }
                newFragment = new FragmentOne();
                break;
            case R.id.img2:
                if (currentFragment instanceof FragmentTwo) {
                    return;
                }
                newFragment = new FragmentTwo();
                break;
            case R.id.img3:
                if (currentFragment instanceof FragmentThree) {
                    return;
                }
                newFragment = new FragmentThree();
                break;
            case R.id.img4:
                if (currentFragment instanceof FragmentFour) {
                    return;
                }
                newFragment = new FragmentFour();
                break;
            case R.id.img5:
                if (currentFragment instanceof FragmentFive) {
                    return;
                }
                newFragment = new FragmentFive();
                break;
            case R.id.img6:
                if (currentFragment instanceof FragmentSix) {
                    return;
                }
                newFragment = new FragmentSix();
                break;
            case R.id.img7:
                if (currentFragment instanceof FragmentSeven) {
                    return;
                }
                newFragment = new FragmentSeven();
                break;
        }

        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.frame_main, newFragment);
        fragmentTransaction.commit();
    }


}

片段:

代码语言:javascript
复制
public class FragmentTwo extends Fragment  {

        private Spinner religion, subreligion, mtoungue;
        private List<String> religionlist;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_two, container, false);

        }

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            religion = (Spinner)view.findViewById(R.id.spinner_religion);
            fetchlist();

        }

        private void fetchlist() {

            StringRequest stringRequest = new StringRequest(Request.Method.GET, URLUtils.SIGNUP_COTAIN_URL, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    Log.e("ResponceFragmentTwo","***********************"+response);
                    try {


                        religionlist = new ArrayList<String>();

                        JSONObject jo = new JSONObject(response);
                        JSONArray arr = jo.getJSONArray("all_religion");
                        for (int i = 0; i < arr.length(); i++) {
                            JSONObject obj = arr.getJSONObject(i);
                            religionlist.add(obj.getString("name"));
                        }

                        religion.setAdapter(new ArrayAdapter<String>(getActivity(), R.layout.spinner_item, religionlist));



                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getActivity(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show();
                }


            }) {



            };

            RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
            requestQueue.add(stringRequest);

        }


    }
EN

回答 1

Stack Overflow用户

发布于 2016-08-17 14:17:28

在深入研究代码之后,我确信您的问题的核心是getActivity()在交付响应时返回null。这很可能是因为片段不再附加到您的活动中(也就是说,您已经用另一个片段调用了replace )。

最好在调用null之前检查setAdapter (虽然我不知道这是否会对您的功能产生任何不期望的后果):

代码语言:javascript
复制
if (getActivity() != null) {
    religion.setAdapter(new ArrayAdapter<String>(getActivity(), R.layout.spinner_item, religionlist));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38996694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档