如何通过活动中的按钮为viewpager中的不同片段提供侦听器

时间:2019-10-07 07:08:17

标签: android android-viewpager fragment

我正在尝试使用viewpager中的片段创建表单,这是一个逐步的过程。

viewpager中有6个片段。活动中的“返回”按钮和“下一步”按钮。

我想在用户单击“下一步”按钮时保存表单。

代码参考

用于加载片段的适配器

public class RegistrationPagerAdapter extends FragmentPagerAdapter {

Fragment fragment;


public RegistrationPagerAdapter(@NonNull FragmentManager fm, int behavior) {
 super(fm, behavior);
}

@NonNull
@Override
public Fragment getItem(int position) {
 switch (position){
  case 0:
   fragment = new PersonalDetailsFragment();
  break;

  case 1:
   fragment = new AboutMeFragment();
  break;

  case 2:
   fragment = new HoroscopeFragment();
  break;

  case 3:
   fragment = new EducationFragment();
  break;

  case 4:
   fragment = new FamilyFragment();
  break;

  case 5:
   fragment = new ExpectationFragment();
   break;

 }
    return fragment;
}

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

@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}

}

活动中有两个按钮(不在片段中)

public class FormActivity extends AppCompatActivity implements View.OnClickListener {

private static final String TAG = "FormActivity";

AppCompatButton backButton, nextButton;
CustomViewPager viewpager;
Toolbar toolbar;
ApiInterface apiInterface;
RegistrationPagerAdapter adapter;
int status;

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

}

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

private void initilizeToolbar() {
    apiInterface = ApiClient.getClient(getApplicationContext()).create(ApiInterface.class);
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
    castComponents();
}

private void castComponents() {
    viewpager = findViewById(R.id.viewPager);
    backButton = findViewById(R.id.backButton);
    nextButton = findViewById(R.id.nextButton);
    nextButton.setOnClickListener(this);
    backButton.setOnClickListener(this);
    GetAllDetailsOfUser();

}

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

public void setViewPagerData(int status) {
    FragmentManager fm = getSupportFragmentManager();
    adapter = new RegistrationPagerAdapter(fm, 0);
    viewpager.setAdapter(adapter);
    viewpager.setCurrentItem(status);
    viewpager.setPagingEnabled(false);
}

public void GetAllDetailsOfUser() {
    Call<AllProfileDetails> allDetails = apiInterface.allDetails(PrefUtils.getToken(this), PrefUtils.getID(this));
    allDetails.enqueue(new Callback<AllProfileDetails>() {
        @Override
        public void onResponse(Call<AllProfileDetails> call, Response<AllProfileDetails> response) {
            AllProfileDetails all = response.body();
            if (all != null) {
                if (all.getStatus()) {
                    Data data = all.getData();
                    setViewPagerData(data.getProfileCurrentStatus());
                    status = data.getProfileCurrentStatus();
                }
            }
        }

        public void onFailure(Call<AllProfileDetails> call, Throwable t) {
            Crashlytics.log(t.getLocalizedMessage());
        }
    });
}

@Override
public void onClick(View view) {
 switch (view.getId()) {
  case R.id.backButton:
   if (viewpager.getCurrentItem() == 0){

   }else{
       viewpager.setCurrentItem(viewpager.getCurrentItem() - 1);
   }
  break;

  case R.id.nextButton:
      if (viewpager.getCurrentItem() == 6){

      }else{
          viewpager.setCurrentItem(viewpager.getCurrentItem() + 1);
      }

  break;
 }
}

}

这很好,但是这里有问题...

当我将数据保存在Fragment1(即“ PersonalDetailsFragment”)中时,它将移至fragment2(即“ AboutMeFragment”)

再次单击“ AboutMeFragment”的保存按钮时,它仅运行“ PersonalDetailsFragment”的方法

请注意,我将活动按钮分别称为

getActivity().findViewById(R.id.backButton);
getActivity().findViewById(R.id.nextButton);

1 个答案:

答案 0 :(得分:1)

您应该具有<div class="edit-user-form"> <AnimatedUserInput @bind-TbText="@User.ShortId" Placeholder="MHTEE Id"/> <AnimatedUserInput @bind-TbText="@User.FirstName" Placeholder="First name" /> <AnimatedUserInput @bind-TbText="@User.LastName" Placeholder="Last name" /> <AnimatedUserInput @bind-TbText="@User.UserName" Placeholder="Username" /> <AnimatedUserInput @bind-TbText="@User.StaffType" Placeholder="Staff type" /> <AnimatedUserInput @bind-TbText="@User.Token" Placeholder="Token" /> <button class="btn btn-secondary" @onclick="Hide" style="{display:inline-block;}">Back</button> <button class="btn btn-primary" @onclick="SaveUser" style="{display:inline-block;}">Save</button> </div> @code { [Parameter] public vUser User { get; set; } } 之类的界面。

OnSaveTapped

然后使这些片段实现上面的接口,例如:

public interface OnSaveTapped{
   void onSaveTapped();
}

最后,在活动类中:

public class PersonalDetailsFragment extends Fragment implements OnSaveTapped{

   public void onSaveTapped(){
       //do your business code here to save data 
   }
}

不要忘记创建名为@Override public void onClick(View view) { switch (view.getId()) { case R.id.backButton: if (viewpager.getCurrentItem() == 0){ }else{ viewpager.setCurrentItem(viewpager.getCurrentItem() - 1); } break; case R.id.nextButton: if (viewpager.getCurrentItem() == 6){ }else{ viewpager.setCurrentItem(viewpager.getCurrentItem() + 1); } break; case R.id.button_save: ((OnSaveTapped)viewpager.getCurrentFragment()).onSaveTapped(); } 的新方法来返回getCurrentFragment()中的当前项目(片段)。

RegistrationPagerAdapter