Reputation: 383
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();
}
Upvotes: 0
Views: 745
Reputation: 331
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();
}
Upvotes: 1