Android:在主要活动的提示中输入数据后刷新当前显示的ViewPager片段选项卡

时间:2017-09-24 15:18:36

标签: android android-fragments interface android-viewpager android-fragmentactivity

我在主活动中有一个浮动操作按钮(FAB),下面有4个片段标签。

单击FAB时,我有一个单独的对话框提示输入数据,具体取决于显示的选项卡。

现在,对于第一个选项卡,我可以在输入数据后立即刷新片段的内容,并使用Interface在对话框提示中单击“确定”。但是对于选项卡2-4,在每个选项卡2-4的相应对话框提示中单击“确定”后,我无法立即刷新数据。我必须单击第一个选项卡,然后返回到先前显示的选项卡才能刷新视图。

我想做的是:

在第二个/第三个/第四个选项卡中,输入数据并单击相应选项卡的输入对话框提示后,当前显示的选项卡应立即根据我在对话框中输入的内容更新其中的视图并保存到数据库中。

请注意,在单击提示中的“确定”按钮后,我将输入保存到数据库中。

我该怎么做?提前谢谢,感谢您的帮助! :)

这是我的代码(我正在使用界面):

public class MyActivity extends AppCompatActivity {

  private PopupListener popupListener;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Your dialog code.
    setPositiveButton("Ok", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        popupListener.onDialogClick("first_tab"); //"second_tab" for second tab, and so on...
      }
    })
  }

  public void setPopupListener(PopupListener popupListener) {
    this.popupListener = popupListener;
  }

  public interface PopupListener {
    void onDialogClick(String value);
  }
}

第二个标签中的代码:

public class MyFragment extends Fragment {

  @Override
  public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ((MyActivity) getActivity()).setPopupListener(new MyActivity.PopupListener() {
      @Override
      public void onDialogClick(String value) {
        //After clicking dialog ok button in Activity
        setUserVisibleHint(true, view); // get value from the database here.
      }
    });
  }
}

更新当前显示的片段的代码(下面的示例适用于第二 标签):

@Override
public void setUserVisibleHint(boolean isVisibleToUser, final View view) {
  super.setUserVisibleHint(isVisibleToUser);
  if (isVisibleToUser) {
    //get data from database and refresh view.
    viewFunds(view) //method is for updating 2nd tab
  }
}

所有4个片段的OnCreate()内部:

public void onCreate(@Nullable Bundle savedInstanceState) {
  setUserVisibleHint(false);
}

第一个标签代码:(根据评论请求添加)

@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
  super.onViewCreated(view, savedInstanceState);
  ((Main2Activity) getActivity()).setPopupListener(new Main2Activity.PopupListener() {
    @Override
    public void onDialogClick(String value) {
      //After clicking dialog ok button in Activity
      // you will get value here.
      viewBudget(view); //method to updated views inside first tab
    }
  });
}

FAB OnClick Listener:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floatingActionButton_main2);
fab.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          int position = tabLayout.getSelectedTabPosition();

          switch (position) {
            case 0:

              // first tab is selected

              //Toast.makeText(context,"0",Toast.LENGTH_LONG).show();


              break;
            case 1:
              // second tab is selected
              //Toast.makeText(getApplicationContext(),"1",Toast.LENGTH_LONG).show();

              break;
            case 2:
              // third tab is selected
              //Toast.makeText(getApplicationContext(),"2",Toast.LENGTH_LONG).show();
              UpdateableFragment.showDialog(); //ERROR: non static method onDialogClick cannot be referenced from static context
              break;
            case 3:
              // third tab is selected
              //Toast.makeText(getApplicationContext(),"3",Toast.LENGTH_LONG).show();
              break;
          }

1 个答案:

答案 0 :(得分:0)

查看您的代码,我认为您的问题是您的活动有一个侦听器,它可以在单击对话框上的“确定”时调用,但您有四个片段。因此,只有当前注册为侦听器的 one 才能获得回调。

由于您的逻辑正在从一个Activity传递到Fragments,因此这里不需要回调(通常使用回调来将片段传递到拥有的Activity )。

因此,您可以通过显式调用相关片段来替换您的界面:

// Your dialog code.
setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        figureOutWhichFragmentIsSelectedAndCallExplicitUpdateMethodOnIt();
  }
})

现在,这是一个选择。我不知道您的代码或应用程序在您的示例之外的样子,但听起来显示的对话框特定于每个片段?在这种情况下,我认为让有问题的片段显示对话框并处理交互本身更有意义。

所以你可以拥有所有片段的接口/基础:

public interface UpdateableFragment {
    void showDialog();
}

然后为每个片段实现此接口:

public TabOneFragment extends Fragment implements UpdateableFragment {
    @Override
    public void showDialog() {
        // Show dialog for tab one data, register listener, save specific data
    }

其他人的想法相同。然后在你的活动中归结为:

myFabButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        UpdateableFragment fragment = getCurrentlySelectedFragment(); // You define this method to return the current fragment
        fragment.showDialog();
    }
}

这意味着1)活动有更少的逻辑来确定选择哪个片段以及必须调用哪个方法,因为它通过一个公共接口和2)你的片段不必知道什么样的他们附加的Activity(现在每个片段都显式地转换为MyActivity并在其上调用一个已知的方法,这会破坏封装)。

希望有所帮助!