从 DialogFragment 获取价值 [重复]

Posted

技术标签:

【中文标题】从 DialogFragment 获取价值 [重复]【英文标题】:Get value from DialogFragment [duplicate] 【发布时间】:2012-09-19 07:39:52 【问题描述】:

我希望 DialogFragment 向我返回一个值,该值在被解雇时输入到 editQuantity 中。

但我没有任何办法让它发挥作用。我可以通过 intent 传递值来做到这一点,但这会破坏当前活动的进度。

除了通过intent 之外,还有什么方法可以返回值吗?

package com.example.myprojectname;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.InputType;
import android.util.Log;
import android.widget.EditText;

public class QuantityDialogFragment extends DialogFragment implements OnClickListener  


    private EditText editQuantity;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        editQuantity = new EditText(getActivity());
        editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);

        return new AlertDialog.Builder(getActivity())
        .setTitle(R.string.app_name)
        .setMessage("Please Enter Quantity")
        .setPositiveButton("OK", this)
        .setNegativeButton("CANCEL", null)
        .setView(editQuantity)
        .create();

    

    @Override
    public void onClick(DialogInterface dialog, int position) 
        String value = editQuantity.getText().toString();
        Log.d("Quantity: ", value);
        dialog.dismiss();       
    

【问题讨论】:

您想将输入的值传递给您的活动吗? 【参考方案1】:

假设您想将结果转发给调用 Activity:) 试试这个代码 sn-p:

public class QuantityDialogFragment extends DialogFragment implements OnClickListener 

    private EditText editQuantity;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        editQuantity = new EditText(getActivity());
        editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);

        return new AlertDialog.Builder(getActivity()).setTitle(R.string.app_name).setMessage("Please Enter Quantity")
                .setPositiveButton("OK", this).setNegativeButton("CANCEL", null).setView(editQuantity).create();

    

    @Override
    public void onClick(DialogInterface dialog, int position) 
        String value = editQuantity.getText().toString();
        Log.d("Quantity: ", value);
        MainActivity callingActivity = (MainActivity) getActivity();
        callingActivity.onUserSelectValue(value);
        dialog.dismiss();
    

并在您的活动上添加:

public class MainActivity extends FragmentActivity 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        QuantityDialogFragment dialog = new QuantityDialogFragment();
        dialog.show(getSupportFragmentManager(), "Dialog");
    

    /**
     * callback method from QuantityDialogFragment, returning the value of user
     * input.
     * 
     * @param selectedValue
     */
    public void onUserSelectValue(String selectedValue) 
        // TODO add your implementation.
    

【讨论】:

这只是一个例子,这取决于您是否需要活动响应同步/异步,对于异步您可以使用本地广播接收器。对于同步实现,我认为这是最好的。这可以使用通用接口进行优化... 我在将getActivity() 的结果转换为适当的活动方面没有取得太大的成功。如果我想为多个活动重用对话框怎么办...我将为自己保存一个 ClassCastException 并在对话框中实现简单的setListener(interface name) 方法。 @SomeoneSomewhere 是的,您可以添加侦听器,如我之前的 cmets 所述。您必须确保删除 Listener,在 Dialog 类上将其设置为 null,以避免由于循环引用而导致内存泄漏。 @reegan29 这个解决方案运行良好......你的问题是什么?从答案中我看不到任何 setText 或 getText !!! @reegan29 在 android 上我们从不实例化 Activity,所以从未见过 new MainActivity() !!!抱歉,我不提供自定义支持。谢谢。【参考方案2】:

更进一步,我在对话框中创建了一个监听器接口,并在主活动中实现了它。

public interface OnDialogResultListener 
    public abstract void onPositiveResult(String value);
    public abstract void onNegativeResult();


public void setOnDialogResultListener(OnDialogResultListener listener) 
    this.onDialogResultListener = listener;

在覆盖的 onCancel(DialogInterface)onPositiveResult(String) 中调用 onNegativeResult(),您希望对话框返回值。

注意:在调用onPositiveResult() 后不要忘记dismiss() 你的对话框,否则对话框窗口将保持打开状态。

然后在您的主要活动中,您可以为对话框创建一个侦听器,如下所示:

QuantityDialogFragment dialog = new QuantityDialogFragment();
dialog.setOnDialogResultListener(new QuantityDialogFragment.OnDialogResultListener() 
        @Override
        public void onPositiveResult(String value) 
            //Do something...
        

        @Override
        public void onNegativeResult() 
            //Do something...
        
    );

这将使您的对话框更易于以后重用。

【讨论】:

这并不总是有效 - 如果屏幕旋转,将重新创建活动并重新创建对话框片段。但是它们将不再连接 b/c 没有重新执行“显示对话框”代码来设置侦听器... 是的,这是真的,任何人都可以提供一个 DialogFragment 的示例,其中包含对主要活动的回调?

以上是关于从 DialogFragment 获取价值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 findFragmentByTag 从 FragmentManager 获取 DialogFragment

JavaScript - 从开关中获取价值[重复]

使用“getElementById”从javascript获取价值到java [重复]

DialogFragment 优于 AlertDialog [重复]

Javascript:通过将路径作为字符串传递给对象来从对象中获取深层价值[重复]

Javascript:通过将路径作为字符串传递给对象来从对象中获取深层价值[重复]