findViewById возвращает NULL при использовании фрагмента
Я новичок в разработке Android и, конечно, на фрагментах.
Я хочу получить доступ к элементам управления моего фрагмента в основном действии, но' 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 файла 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.
что отсутствует в моем коде или что должен ли я это сделать?
6 ответов
попробуйте так на своих фрагментах на 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;
}
вы должны 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;
}
}
Я опаздываю, но для всех, у кого есть эта проблема. Вы должны раздувать свое представление в методе onCreateView. Затем переопределите onCreateActivity
способ и вы можете использовать getView().findViewById
там.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment, container, false);
}
вы не можете получить доступ к представлению фрагмента в классе activity по findViewById
вместо этого вы можете сделать это...
у вас должен быть объект класса фрагмента в файле активности, верно? создайте метод getter класса EditText в этом классе фрагментов и получите доступ к этому методу в своей деятельности.
создайте обратный вызов в классе фрагментов для события, в котором вам нужен объект Edittext.
1) Попробуйте это:
меню Eclipse - > проект - > очистить...
обновление
2) Если у вас есть 2 или более экземпляров "основного" макета, проверьте, все ли они имеют вид с идентификатором "txtXML"
3)
фрагмент-это фрагмент пользовательского интерфейса или поведения приложения, который может быть помещен в действие. Взаимодействие с фрагментами осуществляется через FragmentManager, который может быть получен через Activity.getFragmentManager() и Фрагмент.getFragmentManager().
класс фрагментов можно использовать многими способами для достижения самых разных результатов. Это ядро, оно представляет собой определенную операцию или интерфейс, который работает в рамках большей активности. Фрагмент тесно связан с деятельностью, в которой он находится, и не может использоваться отдельно от одного. Хотя Fragment определяет свой собственный жизненный цикл, этот жизненный цикл зависит от его активности: если действие остановлено, никакие фрагменты внутри него не могут быть запущены; когда активность уничтожается, все фрагменты будут уничтожены.
исследование этой. необходимо использовать FragmentManager.
Если вы хотите использовать findViewById как вы используете в действиях onCreate, вы можете просто поместить все в переопределенный метод onActivityCreated.