0

Я пишу приложение, в котором пользователь описывает проблему, а затем получает совет. Пользователь нажимает кнопку, которая показывает диалог с EditText. Как только пользователь нажимает OK, я хочу получить их вход, но у меня проблемы с дополнительными функциями. Я читал подобные вопросы, но я не могу найти проблему. На сводном экране, где я показываю информацию, текст не появляется. Любая помощь приветствуется!Get and Put extra, DialogFragment

Я думаю, что проблема в том, что я звоню getText() на EditText. Использование 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

вы начали диалог, не являющийся активным, так что вы не видите результаты. –

+0

Попробуйте создать интерфейс, который будет реализован в команде, и объявите его внутри вашего диалоговогофрагмента и используйте его, когда пользователь нажимает ok –

ответ

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

Вы проблема здесь, ваш EditText не добавляется к вашей Диалог дерева. Я думаю, что вы должны сделать так:

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

Спасибо, я думаю, что это фиксированная часть проблемы. Использование log.d в методе onClick() для setPositiveButton() показывает, что он успешно присваивает значение. Тем не менее, я все еще ничего не получаю, когда вызывается onActivityResult(). Вы хоть представляете, что происходит не так?

Посмотрите здесь, другая проблема опечатка:

if (resultCode == REQUEST_TEXT) 
    { 

Это должно быть requestCode.

Я думаю, что это должно исправить вашу проблему, но вам лучше следовать предложению bean_droid и использовать интерфейс вместо вызова метода onActivityResult(). Это потому, что этот метод может быть вызван другой частью вашего кода, чего вы не хотите.

+0

Спасибо, я думаю, что это исправляло часть проблемы. Использование 'log.d' в методе' onClick() ' из 'setPositiveButton()' показывает, что он успешно присваивает значение. Тем не менее, я все еще ничего не получаю, когда я вызываю 'onActivityResult()'. Есть ли у вас какие-либо идеи, что происходит не так? – pez

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

Спасибо, я дам вам попробовать , Официальные страницы Google также предлагают реализацию интерфейсов. – pez

+0

onActivityResult не работает, потому что вы вызываете диалоговоефрагмент, поэтому его не получаете никаких данных –

+0

В книге Android, которую я использую, один из их примеров, который был похож на мое приложение, использовал 'onActivityResult()', и они объяснили: Может показаться странным назвать 'Fragment.onActivityResult()', учитывая, что в этом взаимодействии хостинг-активность не получает вызова в Activity.onActivityResult().Однако использование 'onActivityResult()' для передачи данных из одного фрагмента другого не только работает, но и дает некоторую гибкость в том, как вы представляете фрагмент диалога. " Я новичок в Android, поэтому вы можете быть правы, но он действительно работал в их примере. – pez

Смежные вопросы