0

我在写一个应用程序,用户描述一个问题然后接收建议。用户按下一个显示EditText对话框的按钮。一旦用户按下OK,我想获得他们的输入,但是我有额外的麻烦。我读过类似的问题,但似乎无法找到问题所在。在显示信息的摘要屏幕上,不会出现任何文字。任何帮助表示赞赏!获取和放置额外的,DialogFragment

我认为问题是我在EditText上拨打getText()。使用log.dmText只是一个空字符串。

这是我的代码:

从其中的对话框被称为片段AdviceFragment

private static final String DIALOG_TEXT = "text"; 
private static final int REQUEST_TEXT = 0; 
private Advice mAdvice; 
private boolean hasText; 

... 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 
{ 
    ... 

    mTextButton = (Button) v.findViewById(R.id.textButton); 
    mTextButton.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      FragmentManager fm = getActivity().getSupportFragmentManager(); 
      InputTextFragment dialog = new InputTextFragment(); 
      dialog.setTargetFragment(AdviceFragment.this, REQUEST_TEXT); 
      dialog.show(fm, DIALOG_TEXT); 
     } 
    }); 
} 

... 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode != Activity.RESULT_OK) 
    { 
     return; 
    } 

    if (resultCode == REQUEST_TEXT) 
    { 
     String text = data.getStringExtra(InputTextFragment.EXTRA_TEXT); 
     if (text.length() > 0) 
     { 
      mAdvice.setText(text); 
      hasText = true; 
     } 
     else 
     { 
      mAdvice.setText(null); 
      hasText = false; 
     } 
    } 

InputTextFragment对话框:

public class InputTextFragment extends DialogFragment 
{ 
    public static final String EXTRA_TEXT = "text"; 
    private String mText; 

    private void sendResult(int resultCode) 
    { 
     if (getTargetFragment() == null) 
     { 
      return; 
     } 

     Intent i = new Intent(); 
     i.putExtra(EXTRA_TEXT, mText.toString()); 

     getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, i); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     View v = getActivity().getLayoutInflater().inflate(R.layout.dialog_input_text, null); 

     final EditText editText = new EditText(getActivity()); 

     return new AlertDialog.Builder(getActivity()) 
       .setView(v) 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int whichButton) 
        { 
         String input = editText.getText().toString(); 
         if (input.length() > 0) 
         { 
          mText = input; 
         } 
         else 
         { 
          return; 
         } 

         sendResult(Activity.RESULT_OK);    
        } 
       }) 
       .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() 
       { 
        ... 
       }) 
       .create(); 
    } 
} 
+0

你开始了一个dialogfragment不是活动,所以你看不到结果 – 2014-09-30 02:30:38

+0

尝试创建一个接口,该adviceFragment将实现并在dialogfragment中声明并在用户按下时使用它ok – 2014-09-30 02:31:53

回答

1
final EditText editText = new EditText(getActivity()); 

您的问题就在这里,你的EditText不会添加到您的对话框的视图树。我想你应该这样做:

final EditText editText = (EditText)v.findViewById(your_edittext_id); 

谢谢,我想这已经解决了问题的一部分。使用setPositiveButton()的 onClick()方法中的log.d显示成功指定值 。但是,当我调用onActivityResult()时,我仍然没有收到任何东西。你有什么想法发生了什么问题?

看这里,另一个问题错字:

if (resultCode == REQUEST_TEXT) 
    { 

应该requestCode。

我认为这应该可以解决您的问题,但是您最好遵循bean_droid的建议并使用接口而不是调用onActivityResult()方法。这是因为这种方法可能会被你不想要的代码的其他部分调用。

+0

谢谢,我认为这已经解决了部分问题。在'onClick()'方法中使用'log.d' 'setPositiveButton()'表明它正在成功赋值,但是当我调用'onActivityResult()'的时候,我仍然没有得到任何东西。你有什么想法发生了什么错误? – pez 2014-09-30 02:43:04

0

替换sendResult(Activity.RESULT_OK); getActivity()。setResult(resultCode);

1

这里试试这个:

Public class AdviceFragment extends Fragment implements OkClickListener{ 

     @Override 
     Public void onClick(String data){ 

     //DO YOUR CODE HERE 
     } 
} 

InputTextFragment

Public Class InputTextFragment extends DialogFragment{ 
     public interface OkClickListener{ 
      public void onClick(String data); 
     } 

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     View v = getActivity().getLayoutInflater().inflate(R.layout.dialog_input_text, null); 

     final EditText editText = new EditText(getActivity()); 

     return new AlertDialog.Builder(getActivity()) 
       .setView(v) 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
       { 
        @Override 
        public void onClick(DialogInterface dialog, int whichButton) 
        { 
         String input = editText.getText().toString(); 
         if (input.length() > 0) 
         { 
          mText = input; 
         } 
         else 
         { 
          return; 
         } 

         ((OkClicklistener)getTargetFragment()).onClick(data); 

        } 
       }) 
       .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() 
       { 
        ... 
       }) 
       .create(); 
    } 
} 
    } 
+0

谢谢,我会试试这个。谷歌的官方网页还建议实施界面。 – pez 2014-09-30 02:50:38

+0

onActivityResult不会工作,因为你调用对话框这就是为什么它不是你没有得到任何数据 – 2014-09-30 02:52:51

+0

在我正在使用的一本Android书中,他们的一个例子与我的应用类似'onActivityResult()',他们解释说:“调用'Fragment.onActivityResult()'看起来可能很奇怪,因为在这个交互中主机活动没有收到对'Activity.onActivityResult()'的调用。但是,使用'onActivityResult()'将数据从另一个片段传递回另一个片段不仅可以工作,而且可以为您呈现对话框片段提供一些灵活性。“ 我是Android新手,所以您可能是对的,但它确实在他们的例子中工作 – pez 2014-09-30 02:55:43