Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将字符串对象从DialogFragment传递到MainActivity_Java_Android_Dialogfragment - Fatal编程技术网

Java 无法将字符串对象从DialogFragment传递到MainActivity

Java 无法将字符串对象从DialogFragment传递到MainActivity,java,android,dialogfragment,Java,Android,Dialogfragment,我已经用OnCreateDialog(Bundle)]创建了一个DialogFragment[实现为AlertDialog 对话框片段要求用户通过编辑文本框输入项目名称(字符串),我正试图将其传递回主活动 在MainActivity中,我使用Toast来检查字符串是否确实被传递了。此检查失败,因为未通过任何检查。但是,如果我在我的对话框片段中对字符串进行硬编码,它就会工作。这让我怀疑我试图定位EditText对象的方式有问题,但我不确定我的错误是什么 MainActivity.java publ

我已经用
OnCreateDialog(Bundle)
]创建了一个
DialogFragment
[实现为
AlertDialog

对话框片段
要求用户通过编辑文本框输入项目名称(
字符串
),我正试图将其传递回
主活动

MainActivity
中,我使用Toast来检查
字符串是否确实被传递了。此检查失败,因为未通过任何检查。但是,如果我在我的
对话框片段
中对字符串进行硬编码,它就会工作。这让我怀疑我试图定位EditText对象的方式有问题,但我不确定我的错误是什么

MainActivity.java

public class MainActivity extends AppCompatActivity  implements NewProjectDialog.NewProjectDialogListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //initialize the two on screen buttons
    //onclick listeners are attached to activity_main.xml
    Button newProject = (Button) findViewById(R.id.new_project);
    Button browseProjects = (Button) findViewById(R.id.browse_projects);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void newProject(View view) {
    //Open up the DialogFragment that prompts user for the title
    DialogFragment newFragment = new NewProjectDialog();
    newFragment.show(getFragmentManager(), "New Project Dialog");
}

@Override
public void onDialogOK(String projectTitle) {
    //Toast.makeText(MainActivity.this, projectTitle, Toast.LENGTH_SHORT).show();

}

@Override
public void onDialogCancel() {
    //user pressed cancel in NewProjectDialog
    Toast.makeText(MainActivity.this, "Cancelled", Toast.LENGTH_SHORT).show();
}

public void browseProjects(View view){
    Toast.makeText(MainActivity.this, "Browse Projects", Toast.LENGTH_SHORT).show();
}
public class NewProjectDialog extends DialogFragment{

/* The activity that creates an instance of this dialog fragment must
 * implement this interface in order to receive event callbacks.
 * Each method passes the DialogFragment in case the host needs to query it. */
public interface NewProjectDialogListener {
    public void onDialogOK(String projectTitle);
    public void onDialogCancel();
}

// Use this instance of the interface to deliver action events
NewProjectDialogListener mListener;

// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the NoticeDialogListener so we can send events to the host
        mListener = (NewProjectDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement NoticeDialogListener");
    }
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder newProjectDialog = new AlertDialog.Builder(getActivity());

   //prevent dialog from closing
    setCancelable(false);

   //set dialog title
    newProjectDialog.setTitle(R.string.new_project_title);

    //inflate view so that findViewbyId on the next line works
    View view = View.inflate(getActivity(),R.layout.new_project_dialog, null);
    //Link tempEdit object to the text-edit box so we can retrieve data from it below upon button click
    final EditText tempEdit = (EditText)view.findViewById(R.id.project_title);

    //set the view
    newProjectDialog.setView(R.layout.new_project_dialog);

    //set OK button
    newProjectDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            //Toast.makeText(getActivity(), tempEdit.getText().toString(), Toast.LENGTH_SHORT).show();
            mListener.onDialogOK(tempEdit.getText().toString());
        }
    });

    //set cancel button
    newProjectDialog.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            mListener.onDialogCancel();
        }
    });

    // Create the AlertDialog object and return it
    return newProjectDialog.create();
}
NewProjectDialog.java

public class MainActivity extends AppCompatActivity  implements NewProjectDialog.NewProjectDialogListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //initialize the two on screen buttons
    //onclick listeners are attached to activity_main.xml
    Button newProject = (Button) findViewById(R.id.new_project);
    Button browseProjects = (Button) findViewById(R.id.browse_projects);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void newProject(View view) {
    //Open up the DialogFragment that prompts user for the title
    DialogFragment newFragment = new NewProjectDialog();
    newFragment.show(getFragmentManager(), "New Project Dialog");
}

@Override
public void onDialogOK(String projectTitle) {
    //Toast.makeText(MainActivity.this, projectTitle, Toast.LENGTH_SHORT).show();

}

@Override
public void onDialogCancel() {
    //user pressed cancel in NewProjectDialog
    Toast.makeText(MainActivity.this, "Cancelled", Toast.LENGTH_SHORT).show();
}

public void browseProjects(View view){
    Toast.makeText(MainActivity.this, "Browse Projects", Toast.LENGTH_SHORT).show();
}
public class NewProjectDialog extends DialogFragment{

/* The activity that creates an instance of this dialog fragment must
 * implement this interface in order to receive event callbacks.
 * Each method passes the DialogFragment in case the host needs to query it. */
public interface NewProjectDialogListener {
    public void onDialogOK(String projectTitle);
    public void onDialogCancel();
}

// Use this instance of the interface to deliver action events
NewProjectDialogListener mListener;

// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the NoticeDialogListener so we can send events to the host
        mListener = (NewProjectDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement NoticeDialogListener");
    }
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder newProjectDialog = new AlertDialog.Builder(getActivity());

   //prevent dialog from closing
    setCancelable(false);

   //set dialog title
    newProjectDialog.setTitle(R.string.new_project_title);

    //inflate view so that findViewbyId on the next line works
    View view = View.inflate(getActivity(),R.layout.new_project_dialog, null);
    //Link tempEdit object to the text-edit box so we can retrieve data from it below upon button click
    final EditText tempEdit = (EditText)view.findViewById(R.id.project_title);

    //set the view
    newProjectDialog.setView(R.layout.new_project_dialog);

    //set OK button
    newProjectDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            //Toast.makeText(getActivity(), tempEdit.getText().toString(), Toast.LENGTH_SHORT).show();
            mListener.onDialogOK(tempEdit.getText().toString());
        }
    });

    //set cancel button
    newProjectDialog.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            mListener.onDialogCancel();
        }
    });

    // Create the AlertDialog object and return it
    return newProjectDialog.create();
}

你说得对,问题在于你从不同的角度看待
EditText
。因为你的布局被膨胀了两次


尝试使用而不是布局资源id为
的布局资源

确实是这个原因。您的代码应该是:newProjectDialog.setView(view);