Search code examples
javaandroidcallbackandroid-viewpagerfragment

View update callback for Fragment in ViewPager


Good day!

I have a problem with my view update interface for my Fragments in the ViewPager. I call my update method from a different Class (no Activity, just a Java Class) this works fine, but I implemented the Interface for two Fragments in the row, for example Fragment A and Fragment B implements my Interface. So when I call my method from the Class for Fragment A, the method for Fragment B would execute.

I know the reason, because the ViewPager create the forward Fragment for better swiping.. So I know you knew my question, how can I specify that my update method would be execute only for the Fragment that currently visible for the user, when I call the method from a different class not from the container Activity ?

My Interface:

    public interface IntroSetUpErrorCallback {
    void bondingError();
    void searchError();
    void colorCodeError();
    void sqlAddError();
}

I get access to the methods of the Interface from the class like this:

public void setIntroSetUpErrorCallback(IntroSetUpErrorCallback introSetUpErrorCallback) {
        this.introSetUpErrorCallback = introSetUpErrorCallback;
    }
introSetUpErrorCallback.searchError();

Then I call the searchError() method in my Fragment, only some views changed nothing more, for example Button A set INVISIBLE and Button B set VISIBLE.

Cheers

EDIT:

My ViewPager Activity:

public class IntroSetUpActivity extends AppCompatActivity {
public static final String LOG_TAG = IntroSetUpActivity.class.getName();
private boolean isSuccesfullySetUp = false;
private NonSwipeableViewPager nonSwipeableViewPager;
private  IntroViewPagerAdapter introViewPagerAdapter;
private Button btnBack, btnCancel, btnHelp;
private BleHelper bleHelper;
private int helpId;


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

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_intro_set_up);

    bleHelper = BleHelper.getInstance();

    btnBack = findViewById(R.id.activity_intro_set_up_back_btn);
    btnCancel = findViewById(R.id.activity_intro_set_up_cancel_btn);
    btnHelp = findViewById(R.id.activity_intro_set_up_help_btn);


    btnBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            nonSwipeableViewPager.setCurrentItem(nonSwipeableViewPager.getCurrentItem() - 1);
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(IntroSetUpActivity.this, HomeActivity.class));
            finish();
        }
    });

    btnHelp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            HelpDialogFragment helpDialogFragment = new HelpDialogFragment();
            Bundle args = new Bundle();
            args.putInt(BUNDLE_INTRO_HELP_SET_LAYOUT, helpId == HELP_ID_SEARCH ? HELP_ID_SEARCH : HELP_ID_BONDING);
            helpDialogFragment.setArguments(args);
            ShowDialogHelper.showDialog(helpDialogFragment, IntroSetUpActivity.this, DIALOG_FRAGMENT_TAG_HELP);

        }
    });


    nonSwipeableViewPager = findViewById(R.id.viewPager);

    if (getIntent().getExtras() != null && getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
        introViewPagerAdapter = new IntroViewPagerAdapter(getSupportFragmentManager(), 5, false, false);
    } else if (getIntent().getExtras() != null && getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && !getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)){
        introViewPagerAdapter = new IntroViewPagerAdapter(getSupportFragmentManager(), 7, true, false);

    }else {
        bleHelper.manager.clearQueue();
        try {
            StartApplication.getDevice().disconnect();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        StartApplication.setDevice(null);
        introViewPagerAdapter = new IntroViewPagerAdapter(getSupportFragmentManager(), 5, false, false);
    }
    nonSwipeableViewPager.setAdapter(introViewPagerAdapter);


    if (getIntent().getExtras() != null && getIntent().getExtras().getBoolean(INTENT_BACK_TO_SET_UP_FROM_ERROR)) {
       nonSwipeableViewPager.setCurrentItem(1);
    }


    nonSwipeableViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            switch (position) {
                case 0:
                    btnBack.setVisibility(View.GONE);
                    break;
                case 1:
                    btnBack.setVisibility(View.VISIBLE);
                    break;
                case 2:
                    if (getIntent().getExtras() == null || getIntent().getExtras() != null && getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
                        btnBack.setVisibility(View.GONE);
                        btnCancel.setVisibility(View.GONE);
                    }
                    break;
                case 4:
                    if (getIntent().getExtras() != null && getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT)) {
                        btnBack.setVisibility(View.GONE);
                        btnCancel.setVisibility(View.GONE);
                    }
                    break;
                default:
                    break;
            }
        }

        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}

My Fragment there I execute my method:

public class IntroConnectFragment extends Fragment implements IntroSetUpCallback, IntroSetUpErrorCallback {
private static final String LOG_TAG = IntroConnectFragment.class.getName();
private BleHelper bleHelper;
private TextView tvState, tvBePatient;
private Button btnForward, btnSuccess, btnSearchAgain, btnRestartTut;
private GifImageView gif;
private SharedPreferencesManager sharedPreferencesManager;
private String code;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_connect_intro, container, false);

    sharedPreferencesManager = SharedPreferencesManager.getInstance();

    tvState = view.findViewById(R.id.fragment_connect_intro_tv);
    btnForward = view.findViewById(R.id.fragment_connect_intro_forward_btn);
    btnSuccess = view.findViewById(R.id.fragment_connect_intro_success_btn);
    btnSearchAgain = view.findViewById(R.id.fragment_connect_intro_restart_scan_btn);
    btnRestartTut = view.findViewById(R.id.fragment_connect_intro_restart_tut_btn);
    gif = view.findViewById(R.id.fragment_connect_intro_gif);
    tvBePatient = view.findViewById(R.id.fragment_connect_intro_be_patient_tv);


    bleHelper = BleHelper.getInstance();
    bleHelper.init(getContext(), getActivity());
    bleHelper.setIntroSetUpCallback(this);
    bleHelper.setIntroSetUpErrorCallback(this);
    bleHelper.manager.turnOn();


    btnForward.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (code != null) {
                if (getActivity().getIntent().getExtras() != null && getActivity().getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && !getActivity().getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
                    ((IntroSetUpActivity)getActivity()).skip(6);
                } else if (getActivity().getIntent().getExtras() != null && getActivity().getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && getActivity().getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
                    ((IntroSetUpActivity)getActivity()).skip(4);
                } else {
                    ((IntroSetUpActivity)getActivity()).skip(4);
                }
            } else {
                if (getActivity().getIntent().getExtras() != null && getActivity().getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && !getActivity().getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
                    ((IntroSetUpActivity)getActivity()).skip(5);
                } else if (getActivity().getIntent().getExtras() != null && getActivity().getIntent().getExtras().getBoolean(INTENT_FIRST_I_LOCK_IT) && getActivity().getIntent().getExtras().getBoolean(INTENT_PREMISSIONS_GRANTED)) {
                    ((IntroSetUpActivity)getActivity()).skip(3);
                } else {
                    ((IntroSetUpActivity)getActivity()).skip(3);
                }
            }
        }
    });

    btnSuccess.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent letsGo = new Intent(getActivity(), HomeActivity.class);
            //letsGo.putExtra(INTENT_FIRST_GPS_SCAN, true);
            ((IntroSetUpActivity) getActivity()).setSuccesfullySetUp(true);
            getActivity().startActivity(letsGo);
            getActivity().finish();
        }
    });

    btnSearchAgain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setSearchLayout();
            bleHelper.scanAndConnect();
        }
    });

    btnRestartTut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            bleHelper.manager.shutdown();
            startActivity(new Intent(getActivity(), HomeActivity.class));
            getActivity().finish();
        }
    });


    return view;
}

private void setSearchErrorLayout() {
    btnSearchAgain.setVisibility(View.VISIBLE);
    tvBePatient.setVisibility(View.GONE);
    gif.setImageResource(R.drawable.kreuz);
    tvState.setText(getString(R.string.intro_connect_not_found_error));
    ((IntroSetUpActivity)getActivity()).setBtnCancel(View.VISIBLE);
    ((IntroSetUpActivity)getActivity()).setBtnHelp(View.VISIBLE);
    ((IntroSetUpActivity)getActivity()).setHelpId(HELP_ID_SEARCH);
}

private void setSearchLayout(){
    btnSearchAgain.setVisibility(View.GONE);
    tvBePatient.setVisibility(View.VISIBLE);
    gif.setImageResource(R.drawable.lupe_suche);
    tvState.setText(getString(R.string.intro_connect_search_for_i_lock_it));
    ((IntroSetUpActivity)getActivity()).setBtnCancel(View.GONE);
    ((IntroSetUpActivity)getActivity()).setBtnHelp(View.GONE);
}

private void setBondingErrorLayout() {
    tvState.setText(getString(R.string.intro_connect_bonding_error));
    gif.setImageResource(R.drawable.kreuz);
    tvBePatient.setVisibility(View.GONE);
    btnRestartTut.setVisibility(View.VISIBLE);
    ((IntroSetUpActivity)getActivity()).setBtnCancel(View.VISIBLE);
    ((IntroSetUpActivity)getActivity()).setBtnHelp(View.VISIBLE);
    ((IntroSetUpActivity)getActivity()).setHelpId(HELP_ID_BONDING);
}

@Override
public void onDestroy() {
    super.onDestroy();
    bleHelper.manager.stopAllScanning();
   // bleHelper.manager.shutdown();
}

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

}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        bleHelper.scanAndConnect();
    }
}

@Override
public void searchError() {
    setSearchErrorLayout();
}

Solution

  • Use ViewPager to get position of current fragment

    mViewPager.getCurrentItem()
    

    and also you can get the fragment and use it for method call

    mViewPagerAdapter.getItem(position)
    

    Update: try this in FragmentPagerAdapter getItem method:

    if (mFragmentManager.findFragmentByTag("android:switcher:"+ R.id.view_pager_id + ":" + position) != null) {
        return mFragmentManager.findFragmentByTag("android:switcher:"+ R.id.view_pager_id + ":" + position);
    } else {
        return new MyFragment();
    }