如何将数据从DialogFragment发送到Fragment?

2023-11-25

我有一个片段可以打开Dialogfragment获取用户输入(字符串和整数)。我如何将这两件事发送回片段?

这是我的 DialogFragment:

public class DatePickerFragment extends DialogFragment {
    String Month;
    int Year;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.Date_Picker));
        View v = inflater.inflate(R.layout.date_picker_dialog, container, false);

        Spinner months = (Spinner) v.findViewById(R.id.months_spinner);
        ArrayAdapter<CharSequence> monthadapter = ArrayAdapter.createFromResource(getActivity(),
                R.array.Months, R.layout.picker_row);
              months.setAdapter(monthadapter);
              months.setOnItemSelectedListener(new OnItemSelectedListener(){
                  @Override
                  public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int monthplace, long id) {
                      Month = Integer.toString(monthplace);
                  }
                  public void onNothingSelected(AdapterView<?> parent) {
                    }
              });

        Spinner years = (Spinner) v.findViewById(R.id.years_spinner);
        ArrayAdapter<CharSequence> yearadapter = ArrayAdapter.createFromResource(getActivity(),
             R.array.Years, R.layout.picker_row);
        years.setAdapter(yearadapter);
        years.setOnItemSelectedListener(new OnItemSelectedListener(){
          @Override
          public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int yearplace, long id) {
              if (yearplace == 0){
                  Year = 2012;
              }if (yearplace == 1){
                  Year = 2013;
              }if (yearplace == 2){
                  Year = 2014;
              }
          }
          public void onNothingSelected(AdapterView<?> parent) {}
        });

        Button button = (Button) v.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
           public void onClick(View v) {
               getDialog().dismiss();
            }
        });

        return v;
    }
}

我需要在单击按钮之后和之前发送数据getDialog().dismiss()

这是数据需要发送到的片段:

public class CalendarFragment extends Fragment {
int Year;
String Month;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    int position = getArguments().getInt("position");
    String[] categories = getResources().getStringArray(R.array.categories);
    getActivity().getActionBar().setTitle(categories[position]);
    View v = inflater.inflate(R.layout.calendar_fragment_layout, container, false);    

    final Calendar c = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMMMMMMM");
    Month = month_date.format(c.getTime());
    Year = c.get(Calendar.YEAR);

    Button button = (Button) v.findViewById(R.id.button);
    button.setText(Month + " "+ Year);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
           new DatePickerFragment().show(getFragmentManager(), "MyProgressDialog");
        }
    });
   return v;
  }
}

因此,一旦用户选择了日期Dialogfragment,它必须返回月份和年份。

然后,按钮上的文本应更改为用户指定的月份和年份。


注意:除了一两个 Android Fragment 特定调用之外,这是在松散耦合组件之间实现数据交换的通用方法。您可以安全地使用这种方法在任何事物之间交换数据,无论是片段、活动、对话框还是应用程序的任何其他元素。


这是食谱:

  1. Create interface(即命名为MyContract)包含传递数据的方法的签名,即methodToPassMyData(... data);.
  2. 确保您的DialogFragment履行该合同(这通常意味着实现接口):class MyFragment extends Fragment implements MyContract {....}
  3. 关于创建DialogFragment设置你的调用Fragment as its 目标片段通过致电myDialogFragment.setTargetFragment(this, 0);。这是您稍后将要谈论的对象。
  4. In your DialogFragment,通过调用获取调用片段getTargetFragment();并将返回的对象转换为您在步骤 1 中创建的合约接口,方法是:MyContract mHost = (MyContract)getTargetFragment();。铸造让我们确保目标对象实现所需的契约,并且我们可以期望methodToPassData()到那里。如果没有,那么你将得到定期ClassCastException。这通常不应该发生,除非你做了太多的复制粘贴编码:)如果你的项目使用外部代码、库或插件等,在这种情况下你应该捕获异常并告诉用户即插件不兼容而不是让应用程序崩溃。
  5. 当发回数据的时间到来时,调用methodToPassMyData()在您之前获得的对象上:((MyContract)getTargetFragment()).methodToPassMyData(data);。如果你的onAttach()已经将目标片段强制转换并分配给类变量(即mHost),那么这段代码就只是mHost.methodToPassMyData(data);.
  6. 瞧。您刚刚成功地将数据从对话框传递回调用片段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据从DialogFragment发送到Fragment? 的相关文章

随机推荐

  • 使用 ng-repeat 进行 Angularjs 表排序

    我有一个 HTML 表格 想要对我的记录进行排序 scope records在 ctrl 中 通过单击表标题 scope headers在 ctrl 中 任何人都可以解释为什么它有效 th a headers 0 a th th a hea
  • git 预提交钩子代码格式化与部分提交?

    有没有办法有一个预提交钩子来自动格式化代码 对于 示例与astyle 但是确实not销毁部分提交 工作流程 edit a file txt git add p file txt add one chunk but not another g
  • 如何在 Swift 中获得 Bool 的相反值?

    我的具体情况是我正在尝试切换导航栏的隐藏和显示 let navHidden self navigationController navigationBarHidden self navigationController setNavigat
  • iOS - 如何发出 SOAP 请求并接收关注响应

    我知道网络上有很多关于 如何在 iOS 中使用 SOAP 的内容 但我仍然未能遵循 SOAP 请求和响应 非常感谢帮助 我用的是简单的NSURLConnection用于请求和响应 SOAP 请求 POST asmx HTTP 1 1 Hos
  • 服务器端语音识别[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道已经托管的任何好的服务器端语音识别引擎吗 IE 我希望能够调用一个简单的 Web API 来发布一些声音数据并获取文本 不一定是免费的 但希
  • 获取当前域名

    我的网站在服务器上http www myserver uk com 在此服务器上我有两个域 one com and two com 我想使用 PHP 获取当前域名 但是如果我使用 SERVER HTTP HOST 然后它向我展示 myser
  • 如何在 Rails 连接表迁移中正确索引字段?

    Rails 4 引入了生成连接表迁移的功能 bin rails generate migration CreateTeamsUsersJoinTable team user 这会产生以下文件 class CreateTeamsUsersJo
  • 使用 jQuery,如何仅查找可见元素并保留隐藏元素?

    所以我从第 1 4 项开始 div class someDiv bold italic style display none Lorem div div class someDiv regular italic style display
  • 如何对使用 perlcc 编译的 Perl 程序进行逆向工程?

    我继承了一个在 Unix 上有 编译 perl 脚本的环境 是否可以对其进行反编译 反向工程 无论术语是什么 并从编译后的目标代码中获取源代码 可能不可能 但我想我会问而不是假设 谢谢 凯文 省略已经介绍过的字节码后端 tchrist 只讨
  • CakePHP 2个单独的登录表

    我有一个 Cake 网站 它需要有两个单独的登录名 每个登录名都有自己的登录表单并看到不同的页面 最好有两个不同的表 因为两类人之间没有相似之处 每个登录表单仅由某些人使用 他们永远不会登录另一个表单 反之亦然 还有 两个登录表之间有关系
  • bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:

    我的控制器中的构造函数有一些问题 我尝试在构造函数中调用一项服务 该服务在 AbstractController 中自动装配 但我遇到了空指针异常 一个组件 Component RestController RequestMapping v
  • Java/XSLT:找不到匹配的 1 参数函数

    我收到以下错误 javax servlet ServletException Cannot find a matching 1 argument function named http exslt org dynamic evaluate
  • Spring Boot 数据源配置

    我正在尝试使用application properties文件来配置 Spring Boot 必须使用的数据源 我已将以下属性放入其中 spring datasource driverClassName org postgresql Dri
  • 如何将 URI 转换为文件 Android 10

    如何在 android 10 及以上版本中从 URI 获取文件对象或将 URI 转换为文件对象 final File file new File Environment getExternalStorageDirectory read me
  • Lucene索引从4.6版本升级到8.0.0

    我正在尝试将 Lucene 索引从 4 6 升级到 8 0 0 当我尝试使用以下方式升级工具时 java cp lucene core jar lucene backward codecs jar org apache lucene ind
  • 递归记忆化

    我试图理解memoization的Haskell实现 但我不明白它是如何工作的 memoized fib Int gt Integer memoized fib map fib 0 where fib 0 0 fib 1 1 fib n m
  • 刷新不起作用

    Why fflush 不起作用c2 and c0 如果我使用声明c0 0 and c2 0它有效 但是fflush stdin 不起作用 我尝试放在不同的地方 但它不起作用 我在 ubuntu 13 04 中使用代码块 int main v
  • 如何将 mysql_data_seek 与 PDO 一起使用?

    我想将 mysql data seek 与来自 google 搜索的 PDO 一起使用我发现它应该如下所示 row0 result gt fetch PDO FETCH ASSOC PDO FETCH ORI ABS 0 但这不起作用 我做
  • 同一 AppDomain 中的多个 WPF 应用程序

    我得到以下设置 WPF 应用程序 exe and 包含 WinForms 窗口和 WPF 窗口的 DLL WPF Application exe 从 DLL 调用 WinForms 窗口 WinForms 窗口在 DLL 中创建 WPF 窗
  • 如何将数据从DialogFragment发送到Fragment?

    我有一个片段可以打开Dialogfragment获取用户输入 字符串和整数 我如何将这两件事发送回片段 这是我的 DialogFragment public class DatePickerFragment extends DialogFr