OnClickListener does not work (correctly) after ConfigurationChange in fragments

Introduction

Yes, it is tough . At least I think so ... To clarify the situation:

I did not find the answers to my question after searching the Internet (using Google).

All I found are people who customize onClickListenerfor their own View. I think this is the same problem in my case, but none of the other problems matched mine.

This seems to be the same problem ... It has no answers.

Customization

I have three Fragmentconfigured along with ViewPagerin mine AppCompatActivity.

viewPager = (ViewPager) findViewById(R.id.main_view_pager);
viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));

Processed SectionsPagerAdapter.

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return MainTextHolder.newInstance(tabIndicatorOnClick);
            case 1:
                return PostWriter.newInstance(tabIndicatorOnClick);
            case 2:
                return TopPage.newInstance(tabIndicatorOnClick);
            default:
                return Error.newInstance();
        }
    }

    @Override
    public int getCount() {
        return 3;
    }

    // ... more methods
}

In each of FragmentI have some content plus user-defined TabIndicator.

( xml - View )

<?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="wrap_content" >

    <View
        android:id="@+id/fragment_divider_one"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:tag="one" />

    <View
        android:id="@+id/fragment_divider_two"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:tag="two" />

    <View
        android:id="@+id/fragment_divider_three"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:tag="three" />

</LinearLayout>

onClickListener View () Fragment onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState). onClickListener Activity, my ViewPager, Item (Fragment/tab).

private final View.OnClickListener tabIndicatorOnClick = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (view.getTag().toString().equals("one"))
            viewPager.setCurrentItem(0, true); // second argument for smooth transition
        else if (view.getTag().toString().equals("two"))
            viewPager.setCurrentItem(1, true);
        else if (view.getTag().toString().equals("three"))
            viewPager.setCurrentItem(2, true);
    }
};

onClickListener Fragment, newInstance(View.OnClickListener tabIndicatorOnClick).

. !

public static MainTextHolder newInstance(View.OnClickListener tabIndicatorOnClick) {
    MainTextHolder fragment = new MainTextHolder();
    Bundle args = new Bundle();
    fragment.putIndicatorTabIndicatorOnClick(tabIndicatorOnClick);
    fragment.setArguments(args);
    fragment.setRetainInstance(true);
    return fragment;
}

putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick) - Void Interface. onClickListener Class (Fragment).

@Override
public void putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick) {
    this.tabIndicatorOnClick = tabIndicatorOnClick;
}

, . ... , ConfigurationChange. .

, ConfigurationChange , . onClickListener View Fragment, , tabIndicatorOnClick onClickListener Fragment.

, PostWriter TopPage onClickListener View - . : MainTextHolder Fragment tabIndicatorOnClick null object reference, ViewPager Item. , Tab.

" " ind , onClickListener null object references. , MainTextHolder.

ConfigurationChange onClickListener Fragment, , Fragment /a null object reference.

Activity .

...

... , . , .

minSdkVersion: 14

targetSdkVersion: 25

SpringIndicator ViewPager. onClickListener, "" , OnClick. , TabIndicator, .

, xml :onClick , onClickListener Fragment, , . - ViewPager Fragment, xml, , , , , . , . , .

onClickListener Fragment . , onClickListener, / null object reference.

+4
1

-, . StackOverflow .

, , , . ViewPager, , , , , , , , , Android (, ). Android ViewPager. View.OnClickedListener, , null, , .

, View.OnClickedListener . , OnClickListener onResume(). , , View.OnClickedListener , . , onResume() :

@Override
public void onResume() {
    OnClickListener onClickListener = ((MyActivity) getActivity).getOnClickListener();
    putIndicatorTabIndicatorOnClick(onClickListener);

}

onResume(), onPause():

@Override
public void onPause() {
    //set the onClickListener to null to free up the resource
}

onResume() onPause() - , .

, , , onCreate(Bundle savedInstanceState) .

, :

  • (, ,
  • (, )
  • / , , .

, , .

+2

Source: https://habr.com/ru/post/1666112/


All Articles