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.