首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将数据从DialogFragment返回到调用活动

的常用方法有以下几种:

  1. 使用接口回调:在DialogFragment中定义一个接口,在接口中定义一个方法用于传递数据。然后在调用该DialogFragment的活动中实现接口,并在实现方法中处理返回的数据。

示例代码:

在DialogFragment中定义接口:

代码语言:txt
复制
public class MyDialogFragment extends DialogFragment {
    // 定义接口
    public interface OnDataSelectedListener {
        void onDataSelected(String data);
    }

    private OnDataSelectedListener mListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mListener = (OnDataSelectedListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnDataSelectedListener");
        }
    }

    // 在需要返回数据的地方调用接口方法
    private void sendData(String data) {
        mListener.onDataSelected(data);
    }
}

在调用DialogFragment的活动中实现接口:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity implements MyDialogFragment.OnDataSelectedListener {
    // ...

    @Override
    public void onDataSelected(String data) {
        // 处理返回的数据
        Log.d("MainActivity", "Selected data: " + data);
    }
}
  1. 使用setTargetFragment和onActivityResult方法:在调用DialogFragment时,通过setTargetFragment方法设置目标Fragment(即调用DialogFragment的Fragment),然后在DialogFragment中使用getTargetFragment方法获取目标Fragment,在需要返回数据的地方调用目标Fragment的onActivityResult方法传递数据。

示例代码:

在调用DialogFragment的Fragment中设置目标Fragment和调用方法:

代码语言:txt
复制
public class MyFragment extends Fragment {
    // ...

    private void showDialogFragment() {
        MyDialogFragment dialogFragment = new MyDialogFragment();
        dialogFragment.setTargetFragment(this, 1);
        dialogFragment.show(getFragmentManager(), "dialog");
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
            String result = data.getStringExtra("data");
            // 处理返回的数据
            Log.d("MyFragment", "Selected data: " + result);
        }
    }
}

在DialogFragment中调用目标Fragment的onActivityResult方法传递数据:

代码语言:txt
复制
public class MyDialogFragment extends DialogFragment {
    // ...

    private void sendData(String data) {
        Intent intent = new Intent();
        intent.putExtra("data", data);
        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
    }
}
  1. 使用ViewModel:使用ViewModel来共享数据,通过在DialogFragment中更新ViewModel的数据,在调用DialogFragment的活动中观察ViewModel的数据变化并处理返回的数据。

示例代码:

在DialogFragment中更新ViewModel的数据:

代码语言:txt
复制
public class MyDialogFragment extends DialogFragment {
    // ...

    private void sendData(String data) {
        MyViewModel viewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
        viewModel.setData(data);
    }
}

在调用DialogFragment的活动中观察ViewModel的数据变化:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    // ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...

        MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
        viewModel.getData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String data) {
                // 处理返回的数据
                Log.d("MainActivity", "Selected data: " + data);
            }
        });
    }
}

以上是将数据从DialogFragment返回到调用活动的几种常用方法,根据具体的需求和场景选择适合的方法进行数据的传递和处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 撸起袖子,自己封装 DialogFragment

DialogFragment 产生之前,我们创建对话框一般采用 Dialog,而且代码的编写角度来看,Dialog 使用起来其实更加简单,但是 Google 却是推荐尽量使用 DialogFragment...(fragmentManager, PROGRESS_TAG); return dialogFragment; } 我们先调用了 CommonDialogFragment 的构造函数...,一个 ProgressDialog 传进去,然后依次传入 cancelable 和 cancelListener,最后调用 show() 函数,DialogFragment 显示出来,因为我们使用了构造函数的重载...应该还没忘了我们上面创建了一个 IDialogResultListener 用于 DialogFragment 与逻辑层之间进行数据监听吧,为了能传入各种各样类型的数据,这里我使用了 泛型 来进行处理...可以看到我们在 showInsertDialog() 方法中传入了IDialogResultListener resultListener,当我们想要处理输入的内容的时候,只要在外部调用的时候

1.3K41
  • android推荐使用dialogFrament而不是alertDialog

    inflater.inflate(R.layout.fragment_edit_name, container);   return view;       }   }   c)测试运行: Main方法中调用...5、传递数据给Activity dialog传递数据给Activity,可以使用“fragment interface pattern”的方式,下面通过一个改造上面的登录框来展示这种模式。...builder.create();       }   }   拿到username和password的引用,在点击登录的时候,把activity强转为我们自定义的接口:LoginInputListener,然后将用户输入的数据返回...EditNameDialogFragment我们已经编写好了,直接在MainActivity中写调用 public void showDialogInDifferentScreen(View view)...我们直接把上面登录使用AlertDialog创建的登录框,拷贝到MainActivity中直接调用: public void showLoginDialogWithoutFragment(View view

    2.4K50

    Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制

    举个栗子 我们创建一个Activity,并且在onCreate函数中新建并show一个DialogFragment,之后通过某种方式APP异常杀死(RogueKiller模拟后台杀死工具),再次最近的任务唤起...下面再来看下为什么会出现两个DialogFragment。...Activity都是可能被后台杀死的,比如,在开发者选项中打开不保留活动,就会达到这种效果,在启动另一个Activity时,上一个Activity的保存流程大概如下,这里先简单描述,在下一篇原理篇的时候...所必须的数据,处理不好就会出现上面的那种异常。...通过下面的代码很容易看出,其实就是新建个了一个SavedState场景数据,并且当前的位置mCurItem存进去。

    3K30

    解决Android开发中的痛点问题用Kotlin Flow

    在使用MVVM架构时,数据变化驱动UI更新。对于UI来说只需关心最终状态,但对于一些事件,并不全是希望按照LiveData的合并策略最新一条之前的事件全部丢弃。...那么回到我们的问题,这里用冷流是否可行?显然并不合适,因为首先直观上冷流就无法在构造器以外发射数据。...单向数据流,任何状态的变化都来自事件,因此更容易定位出问题。 理想情况下对View层和ViewModel层做了接口隔离,更加解耦。 状态、事件架构层面上就明确划分,便于约束开发者写出漂亮的代码。...对于大部分的事件处理都只是调用方法,相比直接调用额外多了定义事件类型和中转部分的编码。...比直接使用协程更简单地基于回调的api改写成像同步代码一样的调用 使用callbackFlow,异步操作结果以同步挂起的形式发射出去。

    3.2K20

    Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    Android会在销毁你的Activity之前调用onSaveInstanceState()方法,于是,你可以在此方法中存储关于应用状态的数据。...c)谷歌的官方不建议使用ProgressDialog,这里我们会使用官方推荐的DialogFragment来创建我的加载框,如果你不了解:请看 Android 官方推荐 : DialogFragment...这样,其实给我们带来一个很大的问题,DialogFragment说白了是Fragment,和当前的Activity的生命周期会发生绑定,我们旋转屏幕会造成Activity的销毁,当然也会对DialogFragment...效果图可以看到,无论如何旋转不会重启Activity. 效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始时所说的,当异步任务在执行时,进行旋转,如果解决上面的问题。...~~~~ 效果图: 可以看到我在加载的时候就三心病狂的旋转屏幕~~但是丝毫不影响显示效果与任务的加载~~ 最后,说明一下,其实不仅是屏幕旋转需要保存数据,当用户在使用你的app时,忽然接到一个来电,长时间没有回到你的

    2.1K20

    Android学习笔记(五)Fragment简介

    只有当该Activity处于活动状态时,我们才可以通过方法独立的操作Fragment。 一、Fragment的几个特性   · Fragment总是作为Activity界面的组成部分。...二、创建Fragment   创建Fragment需要继承Fragment基类或者Fragment的子类,Fragment子类有:DialogFragment、ListFragment、PreferenceFragment...2、另外,Fragment与Activity还需要相互传递数据:   · Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments...· 调用popBackStack()Fragment后台栈中弹出(模拟BACK键)。   ...back栈,允许用户按下back键后返回到上一个状态 9 fragmentTransaction.addToBackStack(null); 10 // 5、提交事务 11 fragmentTransaction.commit

    93380

    Android开发笔记(六十七)嵌入页面的碎片

    Fragment 概念 Android3.0之后引入了Fragment,可以把它理解为页面的一个片段,比如一个html网页就包含一个header头部片段,以及一个body身体片段。...方法,因为此时可能状态尚未恢复; 2、不要往Fragment传递较大的参数,比如说图像数据; 3、不要在异步任务中调用commit方法; 竖屏与横屏切换的开发注意事项如下,手机与平板的切换可参照处理...因此为了避免触摸当前页面导致触发上一页面的点击事件,需要在页面切换时禁用上一页面的相关控件,当然返回到上一页面时就得开启相关控件。...Fragment的子类 Android还给Fragment设计了几个子类,分别用在某些特殊的场合,具体说明如下: DialogFragment : 用于对话框的碎片。...参见《Android开发笔记(二十三)文件对话框FileDialog》,对话框页面逻辑要写在onCreateDialog方法中,另外DialogFragment也实现了Dialog的常见方法。

    1.3K60

    三分钟理解“简单工厂模式”——设计模式轻松掌握

    实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。...当这个收银系统的其他地方也需要计算折后价的时候,只能将这段代码复制过去;那如果在维护中发现开发人员把“满10050”写成了“满1000050”,这时候就需要改两个地方,非常不便。...所以高级做法是: 1.这一个个折扣抽象成类,这样方便代码的复用; 2.将对不同折扣的判断客户程序中转移到被调用类中,从而降低客户程序中代码的复杂度。 高级做法的类图: ?...1.此时,对促销类型的判断客户端转移到了Factory类中,从而用户程序只需要给Factory的get促销类()函数传入一个促销名称就能够获取该促销类的对象。...因此,工厂模式能够“客户端对究竟创建何种类型的判断”转移到Factory中,从而减少客户端代码的复杂度,降低服务端与客户端之间的藕合度。

    898120

    三分钟理解“策略模式”——设计模式轻松掌握

    实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。...当这个收银系统的其他地方也需要计算折后价的时候,只能将这段代码复制过去;那如果在维护中发现开发人员把“满10050”写成了“满1000050”,这时候就需要改两个地方,非常不便。...所以高级做法是: 1.这一个个折扣抽象成类,这样方便代码的复用; 2.将对不同折扣的判断客户程序中转移到被调用类中,从而降低客户程序中代码的复杂度。 高级做法的类图: ?...1.此时,对促销类型的判断客户端转移到了Context类的构造函数中,从而用户程序只需要给Context的构造函数传入一个促销名称,Context类中的私有成员变量“促销子类对象”就能够获取该促销类的对象...工厂模式和策略模式都能够“客户端对究竟创建何种类型的判断”转移到Factory/Context中,从而减少客户端代码的复杂度,降低服务端与客户端之间的藕合度。

    772140

    【RL-TCPnet网络教程】第30章 RL-TCPnet之SNTP网络时间获取

    第2个参数是回调函数,回调函数有一个参数,这个参数utc_time代表的含义如下: 调用此函数返回的UNIX时间戳,1970.1.1开始所经历的秒数,如果此数值是0的话(数值0被保留用于表示返回失败...如果发送的数据在重试时间内得不到应答,重新发送数据。 (4)Default Connect Timeout in seconds 范围1-600,单位秒。...只需要调用一次 * 形 参:无 * 回 值: 无 **************************************************************...只需要调用一次 * 形 参:无 * 回 值: 无 **************************************************************...只需要调用一次 * 形 参:无 * 回 值: 无 **************************************************************

    3.4K20

    分布式系统一致性保障方案总结

    比较典型的应用是在现场景下,针对带有现的交易的退款,需要一次性退两笔交易单,采用的就是通过数据库本地事务来完成的。具体如下: ?...第一阶段:主业务服务分别调用所有从业务服务的 try 操作,并在活动管理器中记录所有从业务服务。当所有从业务服务 try 成功或者某个从业务服务 try 失败时,进入第二阶段。...比如资金归集成功,而资金到卡失败,那么对归集的资金操作做回滚处理,也就是资金从中间商户C分别回到商户A和B中。...其基本的设计思想是远程分布式事务拆分成一系列的本地事务。如果不考虑性能及设计优雅,借助关系型数据库中的表即可实现。本地消息的方式,在应用在钱包非核心业务异步化改造项目中。...具体如下: 业务A本地消息和A业务数据以本地事务的方式写入DB1; 业务A写完本地事务后,发送消息给MQ。 MQ推送消息给业务B,业务B执行消息,写入DB2.

    1.2K100

    久闻大名的FragmentAndroid应用界面开发

    View类的实例,View实例返回 跟普通加载控件一样的方法,添加一个Fragment,包含包名的Fragment自定义类填入android:name=""属性中。...获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。 开启一个事务,通过调用beginTransaction()方法开启。...这里写图片描述 连同一个活动之间的Fragment进行交互也非常简单: 他们之间的数据传递 ①Activit传递数据给Fragment: 在Activity中创建Bundle数据包,调用Fragment...这里写图片描述 要用的时候,调用getArguments().getString()方法取出其中对应类型的数据,比如做个点击替换效果,而替换的内容确实是活动传递过去的。...; ->接着还有写一个调用接口中的抽象方法,把要传递的数据传过去 ->再接着就是Activity了,调用Fragment提供的那个方法,然后重写抽象方法的时候进行数据 的读取就可以了!!!

    74120

    代码写错,差点亏了几万!

    这一周都在带大家免费领取一年阿里云服务器的活动,现在已经超 1000+ 人购买了,昨晚我就开始在部分群陆陆续续现,几万块,刷一秒就没了,场面很壮观。 还没现的群,稍等一下,这周都会一起搞完的。...比如这次活动,在收集大家支付宝信息的时候,不管用户提交了几次信息,最终只转账一次。 现的程序是由小北实现的,他在实现的过程中,差点就因为这个事情差点亏了点钱。...以下是小北对这次现的复盘: ---- 不是组织了一场新用户免费领取一年阿里云服务器的活动了,现在已经超过1000人购买,750+人收到了现,不禁发出还得是北哥的感叹!...() // 阿里云导出的订单数据生成一个 map,key是用户的阿里云ID,value是订单信息 for user in users: if user.aliyun_id in order_map...这个现,不是一次就搞完的,是分批的,订单数据一天导出一次,每天晚上我都会运行这个脚本进行现。 那如果是昨天已经现的同学,今天又来提交一次,这种又该怎么办呢?这个问题实际上是怎么做幂等、去重。

    58620

    Android底部弹窗的实现示例代码

    利用DialogFragment实现底部弹窗。 下面,就利用以上三种方式分别实现Android中的底部弹窗。...Gravity.BOTTOM, 0, 0); } 重点看一下这句代码 popupWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0); 这句代码是设置弹出窗口哪里弹出...由于,我们要将mPopWindow放在整个屏幕的最低部,所以我们R.layout.activity_main做为它的父容器,将其显示在BOTTOM的位置。...利用DialogFragment实现底部弹窗 在实现弹窗之前,先了解一下DialogFragment DialogFragment在android 3.0时被引入。...也是Fragment,所以,DialogFragment有和Fragment一样的生命周期,在onStart方法中初始化弹窗的数据,在onCreateView中加载布局,同样,和Fragment使用方法也是一样的

    4.3K31

    设计模式之 - 策略落实

    ,这个活动根据节日的不同也会调整相应的活动规则,比如五一黄金周我们是所有会员商品一律8折,节日过后恢复原价不再优惠,等到了国庆商场有有了新的促销活动,满300减150,那么根据这样的业务需求我们来看看使用策略模式到底应该怎么做...) { // 判断是否满足返利条件 if (money > moneyCondition) { System.out.println("折扣现...money - Math.floor(money / moneyCondition) * moneyRebate; } System.out.println("不够现条件...第一:首先在我们的封装类中其实已经使用到了简单工厂模式,我们使用简单工厂模,我们通过这种方式的封装判断是什么优惠的过程客户端转移到了我们的程序中,客户不需要再去关系; 第二:我们来看下我们昨天的简单工厂模式客户端事怎么调用的...,再来看看我们今天使用策略模式是怎么调用的 ?

    34410

    原来在Android中请求权限也可以有这么棒的用户体验

    DialogFragment也是Google推荐使用的一种对话框实现方案,虽然我认为DialogFragment能实现的功能用Dialog也都能实现,但是强制使用Dialog确实显得有那么一些不友好。...DialogFragment自定义对话框时同样这几个必要的方法进行实现即可。...例如我们调用如下代码来申请权限: PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION...及以下系统,我们可以通过系统API来自动获取某个权限属于哪个权限组,代码如下所示: context.packageManager.getPermissionInfo(permission, 0).group Android...我们都知道,Android 10系统开始,Google引用了深色主题功能,一个出色的App在用户开启了深色主题模式之后,应该自动界面也切换成深色模式。

    2.5K30
    领券