-1

Передаю данные из операции в фрагмент, в фрагменте возвращаемое значение равно null. Обратите внимание, что у меня есть 2 тоста из Фрагмента для проверки значения myValue, а тост возвращается из инструкции else, где myValue имеет значение null.Передача данных из активности в фрагмент Возвращает Null

активность:

  case R.id.forward: 

      Bundle bundle = new Bundle(); 
      bundle.putString("message", "From Activity"); 

      Fragment_02_Contacts mainFragment = new Fragment_02_Contacts(); 
      mainFragment.setArguments(bundle); 

      getSupportFragmentManager().beginTransaction().add(android.R.id.content, mainFragment).commit(); 

      break; 

Фрагмент:

String myValue; 
..... 

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

      if (myValue != null) 
       { 
        myValue = this.getArguments().getString("message"); 

        Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
        return inflater.inflate(R.layout.fragment_02_contacts, container, false); 
       } 
      else 
       { 
        Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
        // message is null ???? 
       } 

EDIT: Я считаю, что причина может быть связана с:

getSupportFragmentManager().beginTransaction().add(android.R.id.content, mainFragment).commit(); 

Разрушает ли это мои аргументы и начинается новый фрагмент?

ответ

1

Сначала назначьте значение для него, а затем проверить, является ли это null так:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     myValue = this.getArguments().getString("message"); 
     if (myValue != null) 
      { 

, как вы сделали это до того, как вы проверили, если значение null прежде, чем на самом деле никогда не назначая к ней ничего (это означает, что всегда был null), поэтому вы всегда оказались в заявлении else и никогда в if, который удерживал присвоение значения.

+0

Если я назначил его сначала, приложение вылетает с помощью: java.lang.NullPointerException: пытается вызвать виртуальный метод «java.lang.String android.os.Bundle.getString (java.lang.String)» в ссылке на нулевой объект , чтобы избежать сбоя приложения, которое я использовал, если/else, поэтому с вашим методом происходит сбой приложения, потому что я получаю нулевую ссылку – user3560827

+0

Это означает, что аргументы не установлены должным образом. Можете ли вы попытаться передать их в конструкторе, а затем установить там? Кроме того, рекомендуется использовать шаблон Factory design со статическим 'newInstance' для фрагментов, искать его. – Vucko

1

Хорошо, я получил его, я помещаю переменную в предложение try/catch вместо if/else, и приложение больше не разбивается, потому что фрагмент сначала начинается с нуля и попадает в catch и после прохождения значение из операции, предложение try возвращает данные.

  try{ 
      myValue = this.getArguments().getString("message"); 
      Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
     }catch(NullPointerException e){ 
      Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
      } 

Итак, идея if/else была почти правильной, ее нужно было попробовать/поймать.

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