FindViewById возвращает NULL при использовании фрагмента
Я новичок в разработке Android и, конечно же, на Fragments.
Я хочу получить доступ к элементам управления моего фрагмента в основной активности, но "findViewById" возвращает значение null.
без фрагмента код работает нормально.
Здесь часть моего кода:
фрагмент:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="HardcodedText" >
<EditText
android:id="@+id/txtXML"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:ems="10"
android:scrollbars="vertical">
</EditText>
</LinearLayout>
onCreate of MainActivity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.initialisePaging();
EditText txtXML = (EditText) findViewById(R.id.txtXML);}
в этой точке txtXML имеет значение null.
Что пропало в моем коде или что мне делать?
Ответы
Ответ 1
Вы должны inflate
расположение фрагмента на onCreateView
методе Fragment
, тогда вы можете просто получить к нему элементы с findViewById
на Activity
.
В этом примере макет моего фрагмента - LinearLayout, поэтому я передаю результат inflate
в LinearLayout.
public class FrgResults extends Fragment
{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//some code
LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false);
//some code
return ll;
}
}
Ответ 2
Попробуйте сделать это на своих фрагментах на onCreateView
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML);
return ll;
}
Ответ 3
Я опаздываю, но для кого-то еще эта проблема. Вы должны раздувать ваш взгляд в методе onCreateView. Затем переопределите метод onCreateActivity
, и вы можете использовать getView().findViewById
там.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment, container, false);
}
Ответ 4
Вы не можете получить доступ к представлению фрагмента в классе активности findViewById
, а то, что вы можете сделать, это...
У вас должен быть объект класса Fragment в вашем файле активности, не так ли? создать метод getter класса EditText в этом классе фрагментов и получить доступ к этому методу в вашей деятельности.
создать обратный вызов в классе Fragment в случае, где вам нужен объект Edittext.
Ответ 5
1) Попробуйте следующее:
Меню Eclipse → Проект → Очистить...
Обновление
2) Если у вас есть два или более экземпляра "основного" макета, проверьте, есть ли у всех из них представление с идентификатором "txtXML"
3)
A Фрагмент - это часть пользовательского интерфейса приложения или поведение, которое может быть помещено в Activity. Взаимодействие с фрагментами осуществляется через FragmentManager, который можно получить через Activity.getFragmentManager() и Fragment.getFragmentManager().
Класс Fragment может использоваться многими способами для достижения широкого спектра результатов. Это ядро, оно представляет собой определенную операцию или интерфейс, который работает в рамках большей активности. Фрагмент тесно связан с активностью, в которой он находится, и не может использоваться отдельно от него. Хотя Fragment определяет свой собственный жизненный цикл, этот жизненный цикл зависит от его активности: если активность остановлена, никакие фрагменты внутри нее не могут быть запущены; когда действие уничтожается, все фрагменты будут уничтожены.
Изучите это. вы должны использовать FragmentManager.
Ответ 6
Если вы хотите использовать findViewById, как вы используете в деятельности onCreate, вы можете просто поместить все в переопределенный метод onActivityCreated.