2016-02-26 5 views
0

Я просто начинаю разработку Android, и недавно я начал учебник по Android на developer.android.com. До сих пор все казалось прекрасным. Я делаю этот курс http://developer.android.com/training/basics/fragments/communicating.html, и я застрял. Я немного изменил его, потому что мне нужна была большая гибкость, поэтому я добавляю свой фрагмент во время выполнения. Я потратил как час на поиск ответа, но не смог найти решение для моей проблемы. :(FindFragmentByTag возвращает значение null.

Вот моя проблема: Я хочу общаться с моим фрагментом так же, как в учебнике, но я использую findFragmentByTag, вместо findFragmentById я сделал все, что мог найти в Интернете, но он говорит:.

java.lang.RuntimeException: не удается запустить Activity ComponentInfo {com.example.filip.t1/com.example.filip.t1.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод void android. widget.TextView.setText (java.lang.CharSequence) 'по ссылке на нулевой объект

Вот мой MainActivity:

public class MainActivity extends FragmentActivity 
implements TextFragment.OnHeadlineSelectedListener{ 

EditText editText; 
TextFragment fragment = new TextFragment(); 
Context context = this; 
String fragment_tag = "FRAGMENTO"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, fragment, fragment_tag).commit(); 
    getSupportFragmentManager().executePendingTransactions(); 

    onArticleSelected(1); 
} 


@Override 
public void onArticleSelected(int position) { 

    TextFragment textFragment = (TextFragment) getSupportFragmentManager().findFragmentByTag(fragment_tag); 

    if(textFragment != null){ 
     String strung = "It should be displayed, but it is not... :("; 
     textFragment.updateText(strung); 
    }else{ 
     Log.e("tag_prog","textFragment == null"); 
    } 
} 

И Fragment:

public class TextFragment extends Fragment { 

TextView textView; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_text, container, false); 
    textView = (TextView)rootView.findViewById(R.id.textView); 
    return rootView; 
} 

OnHeadlineSelectedListener mCallBack; 

public interface OnHeadlineSelectedListener { 
    public void onArticleSelected(int position); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
} 

public void onAttach(Activity activity){ 
    super.onAttach(activity); 

    try{ 
     mCallBack = (OnHeadlineSelectedListener) activity; 
    } catch(ClassCastException e) { 
     throw new ClassCastException(activity.toString() + "must implement OHSL"); 
    } 
} 

public void funkcja(){ 

} 

public void updateText(String s) { 
    textView.setText(s); 
} 

Спасибо за любую

+0

На ваш 'TextFragment.onCreateView' не должны вы быть возвращаем' textView'? – aribeiro

+0

Должен ли я? Я действительно не знаю. Но почему ? – buRn

+0

Нет, не стоит. – barq

ответ

1

Проблема заключается в том, что вы звоните onArticleSelected(1) в onCreate() вашей деятельности. Это происходит до того, как вызывается onCreateView() вашего фрагмента. Поэтому textView по-прежнему остается нулевым.

Попробуйте позвонить по номеру onArticleSelected(1) в onResume() вашей деятельности.

См жизненный цикл вашей деятельности и фрагмент here

+0

Существует. Когда я вызываю функцию updateText() в TextFragment, он меняет текст. – buRn

+0

Показать свой фрагмент_текст.xml и удалить @Nullable из onCreateView(). См. Мой обновленный ответ. – barq

+0

Не удалось изменить вопрос, некоторые странные ошибки. Есть мой TextFragment.xml: http://pastebin.com/a6XkpyCP. Отредактировано @Nullable, все еще ошибка. – buRn

0

В принципе, ваш объект TextView равно нулю, поэтому в настоящее время показано, что ошибка. Причина может заключаться в том, что вы вызываете метод updateText() до того, как фрагмент завершил инициализацию. Попробуйте вызвать этот метод после истечения 400 мс.

Вы можете сделать это

public void updateText(final String s) { 
     if(textView!=null){ 
     textView.setText(s); 
     } 
else{ 
     new android.os.CountDownTimer(400, 400){ 

      @Override 
      public void onFinish() { 
       // TODO Auto-generated method stub 
       updateText(s); 
      } 

      @Override 
      public void onTick(long millisUntilFinished) { 
       // TODO Auto-generated method stub 

      }}.start(); 
} 

    } 
+0

Пришлось пойти, но проверит его позже. :) – buRn

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