Android-使用多个选项卡在Activity中获取Fragment实例

时间:2014-02-14 23:34:19

标签: android interface tabs dialog fragment

我在我的Activity中引用已经实例化的Fragment时遇到了问题。

我有两个标签作为操作栏的一部分,每个标签我都在实例化同一个片段的实例....

Fragment = Player

Tab1 = Player1(播放器片段包含播放器1的DB中的详细信息) Tab2 = Player2(播放器片段包含来自播放器2的DB的详细信息)

播放器片段包括可使用数字选择器修改的字段(已播放的游戏)。 所以......我已经创建了一个我在我的活动中实现的界面。当在Fragment上单击按钮时,它会调用活动上创建Dialog Fragment的界面以显示数字选择器。一旦数字选择器被关闭并传回游戏的数量,我就想在正确的片段上更新这个值(因此,如果在选项卡2上按下该按钮,那么Player2上的值应该更新。)

这是我画空白的地方。

我正在使用actionBar.addTab添加每个选项卡,并使用TabsListener类实现ActionBar.TabListener,以便在按下每个选项卡时替换正确的Fragment。 ActionBar为你处理FragmentManager的东西...... 我认为我需要在我的Activity中做的是获取当前片段,以便我可以调用此片段中的方法来更新它。但是当通过TabListener添加片段时,我看不到一种方法,我可以获取并存储片段实例的ID或为其设置标记。如果可以,那么我可以使用getFragmentByID或getFragmentByTag来查找它。

关于我应该如何做的任何想法。


我认为我有一个完全不同的解决方案,我通过数字选择器本身的数据库更新,然后简单地让onResume()在DialogFragment关闭时更新我的​​可见片段中的值,但似乎没有调用onResume() DialogFragment关闭时。

我没有发布代码示例,因为我希望上面简化了这个问题。

2 个答案:

答案 0 :(得分:1)

FragmentTransaction的'add'和'replace'方法都有许多重载。使用带参数的那个:

 (int containerViewId, Fragment fragment, String tag)

...允许您为片段提供标记名称,随后可以通过调用findFragmentByTag来检索它。

答案 1 :(得分:0)

您可以指定TabListener(http://developer.android.com/reference/android/app/ActionBar.TabListener.html)并在重新选择选项卡时收到通知,您可以在此处更新UI。

在我看来,您应该在用户从对话框中选择值后更新数据库。您可以为对话框上的不同按钮指定OnClickListener,并在选择或取消某些内容时收到通知。

http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog

的示例
public static class MyAlertDialogFragment extends DialogFragment {

  public static MyAlertDialogFragment newInstance(int title) {
      MyAlertDialogFragment frag = new MyAlertDialogFragment();
      Bundle args = new Bundle();
      args.putInt("title", title);
      frag.setArguments(args);
      return frag;
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
      int title = getArguments().getInt("title");

      return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.alert_dialog_icon)
            .setTitle(title)
            .setPositiveButton(R.string.alert_dialog_ok,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doPositiveClick();
                    }
                }
            )
            .setNegativeButton(R.string.alert_dialog_cancel,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((FragmentAlertDialog)getActivity()).doNegativeClick();
                    }
                }
            )
            .create();
  }

}