2014-03-19 39 views
-1

如果此问题已得到解答,但是我一直在四处寻找过去两天的不同事情,并且无法修复我的代码。无法从对话框片段中调用父级片段方法

我正在创建一个带有单选按钮(单选按钮)的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管理。

+0

改变这个'TextView的电视=新的TextView。 (this);'to'TextView tv' – Raghunandan

+0

'dialogSubject ==“fruit”'不起作用,这不是你在Java中比较字符串的方式,2秒的调试会告诉你这样的结果 – njzk2

+0

@Raghunandan:虽然我同意这个实例是无用的,删除它不会解决任何问题。 – njzk2

回答

0

我的歉意...使用dialogSubject.equals("fruit")来比较字符串。

您的新内容未显示在您的父片段中的问题是该片段需要刷新。

只是你的对话框

CustomDialogListener myParentFragment = (CustomDialogListener) getFragmentManager().findFragmentByTag("myParentFragmentTag"); 
myParentFragment.refreshView(); 

onClick方法(setPositiveButton)内添加这和你的父母片段添加下面的方法: (这将refesh父片段它将删除和添加片段的观点 - 这是所有标签(myParentFragmentTag)是要找准根据片段

public void refreshView() { 
    Fragment currentFragment = getActivity().getFragmentManager().findFragmentByTag("myParentFragmentTag"); 
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
    fragmentTransaction.detach(currentFragment); 
    fragmentTransaction.attach(currentFragment); 
    fragmentTransaction.commit(); 
} 

我猜你的MainActivity握着你的父母片段。你会发现代码,就像...:

ParentFragment myParentFragment = new ParentFragment(); 

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
fragmentTransaction.replace(R.id.drawer_main_content_frame, myParentFragment, "myParentFragmentTag"); 
fragmentTransaction.commit(); 

有关的重要组成部分,是来命名的片段。这种情况发生在替换() - >“” myParentFragmentTag”

我希望我的回答是,现在更容易理解:) 让我知道你是否仍然与奋斗

+0

如果我创建一个自定义对话框监听器,对我的'clickListener'不是多余的?另外,不幸的是,因为我是新手这样做,我不怎么实现:-(至于字符串比较,为什么'包含'而不是'等于'?(我试过了,无论如何,它不起作用) – PrincessLilly

+0

我不想滥用你的耐心与基本问题(你可能已经意识到我是一个初学者:-)),但这些是我的困难与您提出的解决方案:第1部分CustomDialogListener - 我想这是一个我不得不创建听众,因为这不是一个类型的解决方案,我找不到任何文献?第2部分)检查我的更新代码上面的错误;第3部分)我无法在我的主要活动中找到这样的代码,也无法在parentFragment中找到这样的代码...我需要在哪里添加它?非常感谢! – PrincessLilly

+0

我发现我的原始实现[这里](http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity)的源代码,并没有提到必须刷新视图。但也许这是需要在我的情况下,因为我试图把数据放在TextView中? – PrincessLilly