如果此问题已得到解答,但是我一直在四处寻找过去两天的不同事情,并且无法修复我的代码。无法从对话框片段中调用父级片段方法
我正在创建一个带有单选按钮(单选按钮)的AlertDialog
。我的对话标题和文本是根据用户从父母FragmentActivity
中点击的按钮动态创建的。然后,如果用户点击肯定按钮(在我的情况下,保存),我希望将与他的选择对应的字符串传回给父项FragmentActivity
,以显示在相应的TextView
中。
这是我DialogFragment
代码:
package com.myDummyProject.FoodSelector;
import java.util.Arrays;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.Toast;
public class DummyDialogFragment extends DialogFragment {
public interface selectChoiceDialogListener {
public void onDialogPositiveClick(DialogFragment dialog,String dialogSubject,CharSequence selectedChoice);
}
selectChoiceDialogListener clickListener;
public static CharSequence[] radioOptions;
public static CharSequence selectedChoice = new String();
public static String dialogSubject = new String();
public static String dialogTitle = new String();
public static CharSequence defaultChoice = new String();
public DummyDialogFragment(){
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Retrieve values from bundle
radioOptions = getArguments().getCharSequenceArray("DIALOG_radioOptions");
dialogSubject = getArguments().getString("CHOICE_TYPE");
dialogTitle = getArguments().getString("DIALOG_TITLE");
defaultChoice = getArguments().getString("DEFAULT_CHOICE");
int defaultValue = Arrays.asList(radioOptions).indexOf(defaultChoice);
selectedChoice = defaultChoice;
// Build the dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(dialogTitle)
.setSingleChoiceItems(radioOptions, defaultValue, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedChoice = radioOptions[which];
}
})
.setPositiveButton(R.string.action_save_allcaps, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Save selectedChoice; will be retrieved and showed in TextView of previous activity
// ==> THIS DOESN'T SEEM TO BE WORKING <==
clickListener.onDialogPositiveClick(DummyDialogFragment.this,dialogSubject,selectedChoice);
CustomDialogListener myParentFragment = (CustomDialogListener) getFragmentManager().findFragmentByTag("myParentFragmentTag"); // ERROR: "CustomDialogListener cannot be resolved to a type"
myParentFragment.refreshView();
// Toast informing user that choice was saved
CharSequence toastMessage = dialogSubject + " saved as " + selectedChoice;
Toast.makeText(getActivity(),toastMessage, Toast.LENGTH_SHORT).show();
// TODO: Return to previous activity -> make sure new values appear in the activity
}
})
.setNegativeButton(R.string.action_cancel_allcaps, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Toast informing user that choice was cancelled
CharSequence toastMessage = dialogSubject + " change was cancelled";
Toast.makeText(getActivity(),toastMessage, Toast.LENGTH_SHORT).show();
}
});
// Create the dialog
return builder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
clickListener = (selectChoiceDialogListener) activity;
}
}
我已经表明我认为不与评论//==> THIS DOESN'T SEEM TO BE WORKING <==
工作。 这是我父FragmentActivity代码:
package com.myDummyProject.FoodSelector;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.NavUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.annotation.TargetApi;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.content.Intent;
import android.os.Build;
import android.support.v4.app.FragmentActivity;
public class DummyParentFragment extends FragmentActivity implements DummyDialogFragment.selectChoiceDialogListener {
(...)
public void pickFruits (View view){
DialogFragment pickFoodsDialog = new DummyDialogFragment();
String dialogTitle = "Select a fruit:";
String dialogSubject = "Fruit";
CharSequence[] radioOptions = new CharSequence[]{"Apple","Banana","Strawberry"};
TextView tv_fruit = (TextView) findViewById(R.id.textView_tv_fruit);
CharSequence defaultFruit = tv_fruit.getText();
Bundle extras = new Bundle();
extras.putCharSequenceArray("DIALOG_radioOptions", radioOptions);
extras.putString("DIALOG_TITLE", dialogTitle);
extras.putString("DIALOG_SUBJECT", dialogSubject);
extras.putCharSequence("DEFAULT_CHOICE", defaultFruit);
pickFoodsDialog.setArguments(extras);
pickFoodsDialog.show(getSupportFragmentManager(),"pickFoodsDialog");
}
public void selectDessert(View view){
DialogFragment pickFoodsDialog = new DummyDialogFragment();
String dialogTitle = "Select a dessert:";
String dialogSubject = "Dessert";
CharSequence[] radioOptions = new CharSequence[]{"Cheescake","Chocolate Cake","Ice Cream","Creme Brulee"};
TextView tv_dessert = (TextView) findViewById(R.id.textView_day);
CharSequence defaultDayOfWeek = dayOfWeek.getText();
Bundle extras = new Bundle();
extras.putCharSequenceArray("DIALOG_radioOptions", radioOptions);
extras.putString("DIALOG_TITLE", dialogTitle);
extras.putString("DIALOG_SUBJECT", dialogSubject);
extras.putCharSequence("DEFAULT_CHOICE", defaultDayOfWeek);
pickFoodsDialog.setArguments(extras);
pickFoodsDialog.show(getSupportFragmentManager(),"pickFoodsDialog");
}
public void selectStarter (View view){
DialogFragment radioButtonsDialog = new DummyDialogFragment();
String dialogTitle = "Select a starter:";
String dialogSubject = "Starter";
CharSequence[] radioOptions = new CharSequence[]{"Soup of the day","Garlic Bread","Prawns with garlic sauce","Mussels in white wine"};
TextView reminder = (TextView) findViewById(R.id.textView_reminder);
CharSequence defaultReminder = reminder.getText();
Bundle extras = new Bundle();
extras.putCharSequenceArray("DIALOG_radioOptions", radioOptions);
extras.putString("DIALOG_TITLE", dialogTitle);
extras.putString("DIALOG_SUBJECT", dialogSubject);
extras.putCharSequence("DEFAULT_CHOICE", defaultReminder);
radioButtonsDialog.setArguments(extras);
radioButtonsDialog.show(getSupportFragmentManager(),"pickFoodsDialog");
}
public void onDialogPositiveClick(DialogFragment dialog, String dialogSubject, CharSequence selectedChoice) {
// User touched the dialog's positive button
TextView tv = new TextView(this);
if(dialogSubject.equals("Fruit")){
tv = (TextView)findViewById(R.id.textView_tv_fruit);
}else if (dialogSubject.equals("Dessert")){
tv = (TextView)findViewById(R.id.textView_dessert);
}else if (dialogSubject.equals("Starter")){
tv = (TextView)findViewById(R.id.textView_starter);
}
tv.setText(selectedChoice);
}
public void refreshView(){
FragmentManager mFragmentManager = new getFragmentManager(); // ERROR: "getFragmentManager cannot be resolved to a type"
Fragment currentFragment = getActivity().getFragmentManager().findFragmentByTag("myParentFragmentTag"); // ERROR: "The method getActivity() is undefined for the type AddModule"
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.detach(currentFragment);
fragmentTransaction.attach(currentFragment);
fragmentTransaction.commit();
}
}
当我按下SAVE
按钮,敬酒的消息显示细腻,然后对话框关闭,但是,我认为,该方法onDialogPositiveClick
不被称为父FragmentActivity
,因为TextViews
从不改变。我认为这将由clickListener
管理。
改变这个'TextView的电视=新的TextView。 (this);'to'TextView tv' – Raghunandan
'dialogSubject ==“fruit”'不起作用,这不是你在Java中比较字符串的方式,2秒的调试会告诉你这样的结果 – njzk2
@Raghunandan:虽然我同意这个实例是无用的,删除它不会解决任何问题。 – njzk2