2014-10-15 7 views
3

Это типичная проблема, но после частых попыток случайных решений, предоставляемых в качестве ответов на подобные вопросы, мой код по-прежнему создает исключение NullPointerException, когда я обращаюсь к текстовому элементу фрагмента из Activity.NullPointerException при доступе к текстовому элементу Fragment в действии

я могу включить (и вид) мой фрагмент, когда его TextView имеет предопределенный текст или с помощью setText() в onCreateView() класса фрагмента, но не используя метод установки (здесь set_message_success()).

Это мой фрагмент класс Fragment_Message:

public class Fragment_Message extends Fragment { 

    TextView textview_message; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_messagebox, container, false); 
     textview_message = (TextView) view.findViewById(R.id.fragment_textview_message); 
     textview_message.setText("test"); 
     return view; 
    } 

    public void set_message_success(String text) { 
     textview_message.setText(text); 
    } 
} 

И соответствующие строки из класса активности:

FragmentManager frag_manager = getFragmentManager(); 
FragmentTransaction transaction = frag_manager.beginTransaction(); 
Fragment_Message fragment  = new Fragment_Message(); 
fragment.set_message_success(message_green); 
transaction.add(R.id.home_fragment_container, fragment, "Fragment"); 
transaction.commit(); 

home_fragment_container является RelativeLayout в моем main_activity.xml, fragment_textview_message является TextView в fragment_messagebox.xml, просто чтобы вы знали, что это такое.

Ошибка NullPointerException в set_message_success(). Есть идеи?

+0

'textview_message' установлен в' null' возможно? Существует ли 'R.id.fragment_textview_message'? – toddlermenot

+0

@toddlermenot Да, 'fragment_textview_message' является идентификатором textView в файле fragment_messagebox.xml. – Peder

ответ

1

Вы создаете фрагмент, но цикл создания не выполняется. Эта линия:

Fragment_Message fragment = new Fragment_Message(); 

НЕ автоматически вызывает onCreateView, таким образом, на ваш взгляд текст не инициализируется (это null) и при попытке установить его текст с помощью следующей строки:

fragment.set_message_success(message_green); 

вы получите исключение, поскольку элемент просмотра текста не инициализирован, чтобы либо инициализировать текстовое представление в конструкторе, либо определить фрагмент в желаемом макете.

Посмотрите here для подробной информации

+0

Я проверил конструктор с одной строкой 'this.textview_message = (TextView) getView(). FindViewById (R.id.fragment_textview_message); '. Но это также создает исключение NullPointerException. Я уже проверил сайт Android сегодня, но либо они включают фрагмент через xml, либо обсуждают более сложную проблему, чем просто использование метода setText(). Оба примера на самом деле не пригодны для меня ... – Peder

+0

Вы сказали, почему возникает ошибка, но не как ее исправить. В чем это проблема? – Si8

0

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

Так я добавил фрагмент в деятельность по onCreate() и изменило фрагмент TextView-текста в деятельности onResume()-х, где (как я понимаю) фрагмент должен быть присоединен. Кроме того, он помогает использовать executePendingTransactions(). Мой сейчас работает код:

Home.java

FragmentManager  frag_manager; 
FragmentTransaction transaction; 
Fragment_Message fragment; 


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

    frag_manager = getFragmentManager(); 
    transaction  = frag_manager.beginTransaction(); 
    fragment  = new Fragment_Message(); 

    transaction.add(R.id.home_fragment_container, fragment, "Fragment_Messagebox"); 
    transaction.commit(); 
} 


@Override 
protected void onResume() { 
     frag_manager.executePendingTransactions();   
     fragment.set_message_success("a message"); 
} 

Fragment_Message.java

public class Fragment_Message extends Fragment { 

    TextView textview_message; 
    View view; 

    public Fragment_Message() {} 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_messagebox, container, false); 
     return view; 
    } 


    public void set_message_success(String text) { 
     textview_message = (TextView) view.findViewById(R.id.fragment_textview_message); 
     textview_message.setText(text); 
    } 
} 
+0

Это решило проблему? Я думаю, что у меня одно и то же: http://stackoverflow.com/questions/39907625/why-is-accessing-textview-of-a-fragment-inside-activity-throwing-an-error – Si8