📌  相关文章
📜  如何将数据从 Dialog Fragment 传递到 Android 中的 Activity?

📅  最后修改于: 2022-05-13 01:54:27.796000             🧑  作者: Mango

如何将数据从 Dialog Fragment 传递到 Android 中的 Activity?

在许多应用程序中,您可能已经看到,每当我们必须做出选择时,都会出现某种提升的对话框,并要求用户进行一些输入或选择。在本文中,我们将看到如何将数据从对话框传递到 android studio 中的活动。

我们将在本文中构建什么?

在本文中,我们将看到一个对话框出现并要求用户输入一条消息,相同的消息将显示在活动中。这是一个示例视频,用于了解我们将在本文中构建的内容以及对话框片段的实际含义

分步实施

步骤 1:创建一个新项目

  • 打开一个新项目。
  • 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
  • 您可以在方便时更改项目的名称。
  • 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java

如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?

第 2 步:使用 XML 文件

导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。

XML


  
    
  
        
  
        


XML


  
    
  
        
  
        
  
        
  
        
  
    


Java
package com.example.dialogfragmenttoactivity;
  
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
  
public class MainActivity extends AppCompatActivity
    implements DialogFragment.OnInputListener {
  
    private static final String TAG = "MainActivity";
  
    @Override public void sendInput(String input)
    {
        Log.d(TAG, "sendInput: got the input: " + input);
  
        mInput = input;
  
        setInputToTextView();
    }
  
    private Button mOpenDialog;
    public TextView mInputDisplay;
  
    public String mInput;
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mOpenDialog = findViewById(R.id.open_dialog);
        mInputDisplay = findViewById(R.id.input_display);
  
        mOpenDialog.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: opening dialog.");
  
                    DialogFragment dialog
                        = new DialogFragment();
                    dialog.show(getFragmentManager(),
                                "MyCustomDialog");
                }
            });
    }
  
    private void setInputToTextView()
    {
        mInputDisplay.setText(mInput);
    }
}


Java
package com.example.dialogfragmenttoactivity;
  
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
  
public class DialogFragment
    extends android.app.DialogFragment {
  
    private static final String TAG = "DialogFragment";
  
    public interface OnInputListener {
        void sendInput(String input);
    }
    public OnInputListener mOnInputListener;
  
    private EditText mInput;
    private TextView mActionOk, mActionCancel;
  
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState)
    {
        View view = inflater.inflate(
            R.layout.dailog_fragment, container, false);
        mActionCancel
            = view.findViewById(R.id.action_cancel);
        mActionOk = view.findViewById(R.id.action_ok);
        mInput = view.findViewById(R.id.input);
  
        mActionCancel.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: closing dialog");
                    getDialog().dismiss();
                }
            });
  
        mActionOk.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: capturing input");
                    String input
                        = mInput.getText().toString();
                    mOnInputListener.sendInput(input);
                    getDialog().dismiss();
                }
            });
  
        return view;
    }
  
    @Override public void onAttach(Context context)
    {
        super.onAttach(context);
        try {
            mOnInputListener
                = (OnInputListener)getActivity();
        }
        catch (ClassCastException e) {
            Log.e(TAG, "onAttach: ClassCastException: "
                           + e.getMessage());
        }
    }
}


按照路径应用 > res > 布局 > 右键单击 > 新建 > 布局资源文件 > 将其命名为“dailog_fragment.xml” 。 .以下是 dailog_fragment.xml 文件的代码 -

XML



  
    
  
        
  
        
  
        
  
        
  
    

第 3 步:使用Java文件

转到MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。

Java

package com.example.dialogfragmenttoactivity;
  
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
  
public class MainActivity extends AppCompatActivity
    implements DialogFragment.OnInputListener {
  
    private static final String TAG = "MainActivity";
  
    @Override public void sendInput(String input)
    {
        Log.d(TAG, "sendInput: got the input: " + input);
  
        mInput = input;
  
        setInputToTextView();
    }
  
    private Button mOpenDialog;
    public TextView mInputDisplay;
  
    public String mInput;
  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mOpenDialog = findViewById(R.id.open_dialog);
        mInputDisplay = findViewById(R.id.input_display);
  
        mOpenDialog.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: opening dialog.");
  
                    DialogFragment dialog
                        = new DialogFragment();
                    dialog.show(getFragmentManager(),
                                "MyCustomDialog");
                }
            });
    }
  
    private void setInputToTextView()
    {
        mInputDisplay.setText(mInput);
    }
}

按照路径app > Java > 右键单击 > new > Java类。将其命名为 DialogFragment。 Java,下面是DialogFragment的代码。 Java文件——

Java

package com.example.dialogfragmenttoactivity;
  
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
  
public class DialogFragment
    extends android.app.DialogFragment {
  
    private static final String TAG = "DialogFragment";
  
    public interface OnInputListener {
        void sendInput(String input);
    }
    public OnInputListener mOnInputListener;
  
    private EditText mInput;
    private TextView mActionOk, mActionCancel;
  
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState)
    {
        View view = inflater.inflate(
            R.layout.dailog_fragment, container, false);
        mActionCancel
            = view.findViewById(R.id.action_cancel);
        mActionOk = view.findViewById(R.id.action_ok);
        mInput = view.findViewById(R.id.input);
  
        mActionCancel.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: closing dialog");
                    getDialog().dismiss();
                }
            });
  
        mActionOk.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View v)
                {
                    Log.d(TAG, "onClick: capturing input");
                    String input
                        = mInput.getText().toString();
                    mOnInputListener.sendInput(input);
                    getDialog().dismiss();
                }
            });
  
        return view;
    }
  
    @Override public void onAttach(Context context)
    {
        super.onAttach(context);
        try {
            mOnInputListener
                = (OnInputListener)getActivity();
        }
        catch (ClassCastException e) {
            Log.e(TAG, "onAttach: ClassCastException: "
                           + e.getMessage());
        }
    }
}

这是我们应用程序的最终输出。

输出: