【问题标题】:How to get the Data from DialogFragment to MainActivity in Android?如何在 Android 中从 DialogFragment 获取数据到 MainActivity?
【发布时间】:2015-06-11 10:06:17
【问题描述】:

我使用DialogFragment 创建了一个应用程序。我想从MainActivity 中的DialogFragmentsetText 获取数据。在我的代码中,我成功创建了AlertDialog。但我无法将EditText 值设置为MainActivity。应用程序崩溃了。请帮我解决问题。我真的很感激。

MainActivity.java

public class MainActivity extends ActionBarActivity {
Button showDialog;
TextView showText;
String myNameStr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    showDialog = (Button)findViewById(R.id.myBtn);
    showText = (TextView)findViewById(R.id.showText);
    showDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showMyAlert(v);
        }
    });
}

public void showMyAlert(View view) {
    MyAlert myAlert = new MyAlert();
    myAlert.show(getFragmentManager(), "My New Alert");
}

public void setMyNameStr(String myNameStr) {
    showText.setText(myNameStr);
}
}

MyAlert.java:

public class MyAlert extends DialogFragment implements OnClickListener {
private EditText getEditText;
MainActivity callBackActivity;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    callBackActivity = new MainActivity();
    getEditText = new EditText(getActivity());
    getEditText.setInputType(InputType.TYPE_CLASS_TEXT);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Get UserName :");
    builder.setMessage("Enter Your Name :");
    builder.setPositiveButton("Ok", this);
    builder.setNegativeButton("Cancel", null);
    builder.setView(getEditText);
    return builder.create();
}

@Override
public void onClick(DialogInterface dialog, int which) {
    String value = getEditText.getText().toString();
    Log.d("Name : ", value);
    MainActivity mainActivity = new MainActivity();
    mainActivity.setMyNameStr(value);
    dialog.dismiss();
}
}

使用这个程序的应用程序崩溃了。

【问题讨论】:

  • 为此创建Interface
  • @MD 如果我想在一个 Activity 中使用多个 DialogFragment。如何导入多个接口?

标签: java android android-fragments


【解决方案1】:

替换为

MainActivity mainActivity = new MainActivity(); 

到:

Activity mainActivity = (MainActivity)getActivity();

【讨论】:

  • 不是Activity,我声明MainActivity mainActivity = (MainActivity)getActivity() 正在工作。太棒了...这是代替接口..
  • @reegan29 代码看起来有点不正确
【解决方案2】:

创建一个类似的界面-

CustomDialogInterface.java

public interface CustomDialogInterface {
    
        // This is just a regular method so it can return something or
        // take arguments if you like.
    public void okButtonClicked(String  value);

    
}

并通过-

修改您的 MyAlert.java
public class MyAlert extends DialogFragment implements OnClickListener {

private EditText getEditText;
MainActivity callBackActivity;
CustomDialogInterface customDI;

public MyAlert(CustomDialogInterface customDI)
{
    this.customDI = customDI;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    callBackActivity = new MainActivity();
    getEditText = new EditText(getActivity());
    getEditText.setInputType(InputType.TYPE_CLASS_TEXT);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Get UserName :");
    builder.setMessage("Enter Your Name :");
    builder.setPositiveButton("Ok", this);
    builder.setNegativeButton("Cancel", null);
    builder.setView(getEditText);
    return builder.create();
}

@Override
public void onClick(DialogInterface dialog, int which) {
    String value = getEditText.getText().toString();
    Log.d("Name : ", value);
    dialog.dismiss();
    customDI.okButtonClicked(value);


}


void setCustomDialogInterface(CustomDialogInterface customDialogInterface){
    this. customDI = customDialogInterface;
c}

}

并在您的 MainActivity 中实现 CustomDialogInterface 并覆盖方法 okButtonClicked() 当 onClick 将被调用时,您的 MainActivity 的 onButtonClicked 将被调用。

并将 showAlert 更改为 -

class MainActivity..... implements CustomDialogInterface { 
        
        public void showMyAlert(View view) {
             MyAlert myAlert = new MyAlert(this);
             myAlert.show(getFragmentManager(), "My New Alert");
        }
        
        @Overide
        public void okButtonClicked(String  value){
            // handle 
        }
    }

或使用以下代码:

  public void showMyAlert(View view) {

     MyAlert myAlert = new MyAlert(this);
     myAlert.setCustomDialogInterface(new CustomDialogInterface() {
            @Override
            public void okButtonClicked(String value) {
                //handle click
            }
        });
     myAlert.show(getFragmentManager(), "My New Alert");        
     
}

【讨论】:

  • 如果我想在一个 Activity 中有多个 DialogFragment。如何导入多个接口?
  • 您可以实现多个接口,但只能扩展 1 个类。示例 - MyClass 类扩展 OtherClass 实现 interface1、interface2...
  • K 兄弟非常感谢..上帝保佑
【解决方案3】:
        you can achieve this using a interface,by sending your data from a fragment to main activity,below i have edited your complete code and its working fine....
       Here is the code with example
        Your Main Activity
        package com.example.dialogfragment;

        import android.annotation.TargetApi;
        import android.app.Activity;
        import android.os.Build;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;

        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public class MainActivity extends Activity  implements SetName{
            Button showDialog;
            TextView showText;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                showDialog = (Button)findViewById(R.id.button1);
                showText = (TextView)findViewById(R.id.textView2);
                showDialog.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showMyAlert(v);
                    }
                });
            }

            public void showMyAlert(View view) {
                MyAlert myAlert = new MyAlert();
                myAlert.show(getFragmentManager(), "My New Alert");
            }

            public void setMyNameStr(String myNameStr) {

            }


            @Override
            public void setMyName(String string) {
                // TODO Auto-generated method stub

                showText.setText(string);

            }

        }

    Your Alert
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.DialogFragment;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.os.Build;
    import android.os.Bundle;
    import android.text.InputType;
    import android.util.Log;
    import android.widget.EditText;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public class MyAlert extends DialogFragment implements OnClickListener {

        private EditText getEditText;
        MainActivity callBackActivity;
        SetName setname;

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            callBackActivity = new MainActivity();
            getEditText = new EditText(getActivity());
            getEditText.setInputType(InputType.TYPE_CLASS_TEXT);
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Get UserName :");
            builder.setMessage("Enter Your Name :");
            builder.setPositiveButton("Ok", this);
            builder.setNegativeButton("Cancel", null);
            builder.setView(getEditText);
            return builder.create();
        }


        @Override
        public void onAttach(Activity a) {
            super.onAttach(a);
            setname = (SetName) a;
        }
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String value = getEditText.getText().toString();
            Log.d("Name : ", value);
            // MainActivity mainActivity = new MainActivity();
            setname .setMyName(value);
            //setname = (SetName)
            // setname = (SetName)getActivity();
            dialog.dismiss();
        }


    }

Create a Interface

public interface SetName {


    void setMyName(String string);

}


Now what you should do is create onAttach in your alertFragment and call your interface..

【讨论】:

    【解决方案4】:
    public void renameFile(){
    RenameFileDialog dialog = new RenameFileDialog();
            dialog.show(getSupportFragmentManager(), DIALOG_RENAME_FILE);
    

    }

      public void syncFolders(String value) {
     //some code
            new UpdateFolderAsyncTask().execute();
        }
    

    在 DialogFragment 类的主活动类 syncFolders() 中执行操作后,使用新的更新值更新列表视图

       CustomDialogFragment extends DialogFragment{
    //some logic for performining operation
    String updatedValue=edittext.getText();
    
    MainActivity activity=(MainActivity)getActivity();
    activity.syncFolders(updatedValue);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多