Search code examples
androidandroid-fragmentscrashappcompatactivity

Android AppcompatActivity with fragments crashes after bringing from background(need to wait couple minutes)


Hi i am having a problem with AppCompatActivity with fragments

i have extended a class with AppCompatActivity which handles the fragments, the problem occurs when the user sends the application background and wait couple of minutes then brings the app front. except that case it doesn't crash at all. (there are some unnecessary codes still in development so don't pay attention to them)

any help will be appreciated, i have stucked at this point for days.

if anything else needed i can update the question and add them

public class SurveyMainFragment extends AppCompatActivity{

    private Toolbar toolbar;
    private Fragment surveyListFragment;
    private Logger Log;


    private SurveyResponseObj surveyResponseObj;


    @Bind(R.id.RelativeSurveyMainFragmentSurveys)
    RelativeLayout surveyTab;

    @Bind(R.id.RelativeSurveyMainFragmentProfile)
    RelativeLayout profileTab;


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

        Log = Logger.getLogger(SurveyMainFragment.class);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setVisibility(View.GONE);

        ButterKnife.bind(this);


        surveyTab.setSelected(true);
        profileTab.setSelected(false);


        Intent i = getIntent();
        if (i != null) {
            surveyResponseObj = i.getParcelableExtra("SurveyResponseList");
        }

        if (surveyResponseObj != null) {

        }


        surveyListFragment = new SurveyListFragment();

        displayFirstTimeUserFragment();

    }

    @OnClick(R.id.RelativeSurveyMainFragmentSurveys)
    void surveysFragment() {
        surveyTab.setSelected(true);
        profileTab.setSelected(false);
    }

    @OnClick(R.id.RelativeSurveyMainFragmentProfile)
    void profileFragment() {
        surveyTab.setSelected(false);
        profileTab.setSelected(true);
    }

    protected void displayFirstTimeUserFragment() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        if (surveyListFragment.isAdded()) { // if the fragment is already in container
            ft.show(surveyListFragment);
        } else { // fragment needs to be added to frame container
            Bundle bundle = new Bundle();
            bundle.putParcelable("surveyResponse", surveyResponseObj);
            surveyListFragment.setArguments(bundle);
            ft.add(R.id.fragment_survey_place, surveyListFragment, "SurveyListFragment");
        }

        ft.commit();
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i("onSaved"+outState.toString());
//        outState.putInt("someVarA", someVarA);
//        outState.putString("someVarB", someVarB);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i("onRestoreInstanceState" + savedInstanceState.toString());
        displayFirstTimeUserFragment();
//        someVarA = savedInstanceState.getInt("someVarA");
//        someVarB = savedInstanceState.getString("someVarB");
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }


    @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);
    }


}

this is the survey_main_fragment.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"
    android:id="@+id/RelativeSurveysMainFragmentRoot"
    tools:context="com.example.app.PersonalityTestFlow.SurveyMainFragment">

    <include layout="@layout/tool_bar" />

    <include layout="@layout/content_survey_main" />

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

this is the content survey main xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.example.app.PersonalityTestFlow.SurveyMainFragment"
        tools:showIn="@layout/survey_main_fragment">


<fragment
    android:id="@+id/fragment_survey_place"
    android:name="com.example.app.emptyFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/test"
    tools:layout="@layout/empty_fragment" />

 <RelativeLayout
        android:id="@+id/RelativeSurveysFragmentErrorLayout"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_alignParentBottom="true"
        android:background="@color/TransparentBlack">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="20dp"
                android:src="@drawable/tarih" />

            <com.example.CustomComponents.CustomTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:textColor="@color/White"
                app:typeface="Bariol"
                android:lineSpacingExtra="2dp"
                android:text="bla bla"
                android:textSize="24sp" />

        </LinearLayout>


    </RelativeLayout>
   </RelativeLayout>

the surveyListFragment code

public class SurveyListFragment extends BaseFragment implements  View.OnTouchListener {


    private Logger Log;
    private View view;


    @Bind(R.id.recyclerViewSurveyList)
    RecyclerView surveyListRecycler;

    ComplexRecyclerViewSurveyListAdapter SurveyListAdapter;


    private ArrayList<SurveyDataObj> surveyDataList;


    private BusinessService BService;

    private SurveyResponseObj surveyResponseObj;
    private SurveyMainFlow surveyMainFlow;






//    @Bind(R.id.RelativeSurveysFragmentRoot)
//    RelativeLayout rootLayout;


    private RelativeLayout errorLayout;

    private float startY;
    private float lastTranslate = 0.0f;
    private float moveFactorY = 0.0f;
    private android.widget.RelativeLayout.LayoutParams layoutParams;
    private boolean animOk = false;

    float dX, dY;

    private int rootHeight;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
//        if (container == null) {
//            return null;
//        }
        Log = Logger.getLogger(SurveyListFragment.class);
        view = inflater.inflate(R.layout.surveys_fragment, container, false);
        ButterKnife.bind(this, view);
        BService = ((PolenioApplication) getActivity().getApplication()).getBusinessService();
        surveyMainFlow = new SurveyMainFlow(getContext(), BService);


        Bundle bundle = this.getArguments();
        if (bundle != null) {
            surveyResponseObj = bundle.getParcelable("surveyResponse");
            if (surveyResponseObj == null) {
                surveyResponseObj = null;
            } else {
                surveyMainFlow.setSurveyResponseObj(surveyResponseObj);
            }
        } else {
            surveyResponseObj = null;
        }



        initLayout();
        setLayoutInfo();




        return view;
    }





    private int dp2px(int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
    }

    private void showErrorDialog() {
        rootHeight =  ((SurveyMainFragment) getActivity()).getRootLayout().getHeight();
//        surveyListRecycler.scrollToPosition(0);
        surveyListRecycler.smoothScrollToPosition(0);
        Log.i(surveyListRecycler.getChildAt(0).getHeight() + " " + surveyListRecycler.getChildAt(0).getWidth() + "root " + rootHeight + "errorLayout" + errorLayout.getHeight());

        errorLayout.getLayoutParams().height = rootHeight - (dp2px(10) + surveyListRecycler.getChildAt(0).getHeight());
        errorLayout.setVisibility(View.VISIBLE);
        TranslateAnimation anim = new TranslateAnimation(0.0f, 0.0f, rootHeight, 0.0f);
        anim.setDuration(300);
        anim.setFillAfter(true);
        errorLayout.startAnimation(anim);

        Log.i("errorLayout" + errorLayout.getHeight());


    }

    private void initLayout() {



        errorLayout = ((SurveyMainFragment) getActivity()).getErrorLayout();

        errorLayout.setVisibility(View.GONE);



        errorLayout.setOnTouchListener(this);


        if (surveyResponseObj != null) {
            surveyDataList = new ArrayList<>(surveyResponseObj.getData());
        } else {
            surveyDataList = new ArrayList<>();
        }
        SurveyListAdapter = new ComplexRecyclerViewSurveyListAdapter(getContext(), surveyDataList, new RecyclerViewListener() {
            @Override
            public void ItemClicked(Object item) {

                Log.i(((SurveyDataObj) item).getTitle());

                    showErrorDialog();

            }
        });

        surveyListRecycler.setAdapter(SurveyListAdapter);
        surveyListRecycler.setLayoutManager(new SnappingLinearLayoutManager(getContext()));
        surveyListRecycler.setItemAnimator(new DefaultItemAnimator());
        surveyListRecycler.setHasFixedSize(true);


    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
//        outState.putString("dataGotFromServer", dataGotFromServer);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
//        dataGotFromServer = savedInstanceState.getString("dataGotFromServer");
    }


    @Override
    public void onSelectionUpdate(float val, float maxval) {
        Log.i("Main" + "Selection update: " + val + ", max: " + maxval);
    }

    @Override
    public void onValueSelected(float val, float maxval) {
        Log.i("Main" + "Selection complete: " + val + ", max: " + maxval);
    }

    public ArrayList<SurveyDataObj> getSurveyDataList() {
        return surveyDataList;
    }

    public void setSurveyDataList(ArrayList<SurveyDataObj> surveyDataList) {
        this.surveyDataList = surveyDataList;
    }


    @Override
    public boolean onTouch(final View view, MotionEvent event) {

        switch (event.getActionMasked()) {

            case MotionEvent.ACTION_DOWN:


                dY = view.getY() - event.getRawY();
                moveFactorY = event.getRawY();

                lastTranslate = view.getY();

                animOk = false;
                break;

            case MotionEvent.ACTION_MOVE:


                if (animOk && moveFactorY - event.getRawY() < 0) {
                    TranslateAnimation anim = new TranslateAnimation(0.0f, 0.0f, lastTranslate, dY + event.getRawY() - view.getY());
                    anim.setDuration(0);
                    anim.setFillAfter(true);
                    view.startAnimation(anim);
                }
                animOk = true;


                lastTranslate = dY + event.getRawY() - view.getY();

                break;
            case MotionEvent.ACTION_UP:

                if (event.getRawY() - moveFactorY > (rootHeight - view.getY()) / 3) {
                    Log.i("Action visibility");
                    TranslateAnimation anim = new TranslateAnimation(0.0f, 0.0f, lastTranslate, rootHeight);
                    anim.setDuration(300);
                    anim.setFillAfter(true);
                    view.startAnimation(anim);
                    anim.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            view.setAnimation(null);
                            view.setVisibility(View.GONE);
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                        }
                    });

                } else {
                    Log.i("Action animation null");
//                    view.getAnimation().cancel();
                    view.setAnimation(null);
//                    view.setVisibility(View.GONE);
                }
//                view.setAnimation(null);
                Log.i("Action up");

                break;
            case MotionEvent.ACTION_CANCEL:
                Log.i("Action cancel");
                break;
            case MotionEvent.ACTION_OUTSIDE:
                Log.i("Action outside");
                break;
            default:
                return false;
        }
        return true;
    }


}

this is the crash log i am having

03-07 21:07:41.550 11477-11477/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                                 Process: com.example.app, PID: 11477
                                                                 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.PersonalityTestFlow.SurveyMainFragment}: android.view.InflateException: Binary XML file line #12: Error inflating class fragment
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376)
                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:147)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:135)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5253)
                                                                     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:900)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
                                                                  Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class fragment
                                                                     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
                                                                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
                                                                     at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916)
                                                                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:802)
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
                                                                     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
                                                                     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
                                                                     at com.example.app.PersonalityTestFlow.SurveyMainFragment.onCreate(SurveyMainFragment.java:64)
                                                                     at android.app.Activity.performCreate(Activity.java:5975)
                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:147) 
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                     at android.os.Looper.loop(Looper.java:135) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5253) 
                                                                     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:900) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695) 
                                                                  Caused by: java.lang.IllegalStateException: Fragment com.example.app.PersonalityTestFlow.SurveyListFragment did not create a view.
                                                                     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2319)
                                                                     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
                                                                     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
                                                                     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
                                                                     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80)
                                                                     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
                                                                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                                                                     at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916) 
                                                                     at android.view.LayoutInflater.rInflate(LayoutInflater.java:802) 
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
                                                                     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
                                                                     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
                                                                     at com.example.app.PersonalityTestFlow.SurveyMainFragment.onCreate(SurveyMainFragment.java:64) 
                                                                     at android.app.Activity.performCreate(Activity.java:5975) 
                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:147) 
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                     at android.os.Looper.loop(Looper.java:135) 
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5253) 
                                                                     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:900) 
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)

Solution

  • I solved the problem with changing the fragment

    <fragment
        android:id="@+id/fragment_survey_place"
        android:name="com.example.app.emptyFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/test" />
    

    with

       <FrameLayout
            android:id="@+id/fragment_survey_place"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_above="@+id/test"/>
    

    no crashes till now