findViewById во фрагменте - PullRequest
943 голосов
/ 27 июня 2011

Я пытаюсь создать ImageView во фрагменте, который будет ссылаться на элемент ImageView, который я создал в XML для фрагмента.Однако метод findViewById работает, только если я расширяю класс Activity.В любом случае я могу использовать его и во Фрагменте?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}

В методе findViewById есть ошибка, которая гласит, что метод не определен.

Ответы [ 33 ]

4 голосов
/ 20 мая 2016

1001 * попробовать *

private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}
4 голосов
/ 24 января 2015

Используйте плагин gradle skeleton , он автоматически сгенерирует классы держателей просмотра со ссылкой на ваш макет.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyLayout myLayout = new MyLayout(inflater, container, false);
        myLayout.myImage.setImageResource(R.drawable.myImage);
        return myLayout.view;
    }
}

Теперь, если вы объявили ImageView в вашем my_layout.xml файл, он автоматически сгенерирует класс myLayout для вас.

4 голосов
/ 29 апреля 2016

Попробуйте:

View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;
3 голосов
/ 06 августа 2014

Вы можете вызвать findViewById() с помощью Объекта деятельности , который находится внутри вашего метода public void onAttach(Activity activity) внутри вашего Фрагмента.

Сохраните действие в переменную, например:

В классе Фрагмент : private Activity mainActivity; В методе onAttach(): this.mainActivity=activity;

Наконец, выполните каждый findViewById через переменную: mainActivity.findViewById(R.id.TextView);

3 голосов
/ 31 декабря 2015

Существует еще один метод, называемый onViewCreated.

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
2 голосов
/ 28 июля 2017

Макет Inflater входит в картину здесь. Layout Inflater - это класс, который позволяет нам использовать представления XML в коде Java. Таким образом, вы можете накачать корневое представление XML в переменной v с помощью следующего кода. И затем с помощью v вы можете найти дочерние представления корневого представления v.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v;
    }
}
2 голосов
/ 06 июня 2017

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

Затем получите представление и используйте его для доступа к каждому идентификатору представления этих элементов представления.

  class Demo extends Fragment
    {
        @Override
        public View onCreateView(final LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
            View view =inflater.inflate(R.layout.demo_fragment, container,false);
            ImageView imageview=(ImageView)view.findViewById(R.id.imageview1);

            return view;
        }
    }
2 голосов
/ 06 декабря 2015

Внутри метода onCreateView

1) сначала вы должны надуть макет / представление, которое вы хотите добавить, например.LinearLayout

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);

2) Затем вы можете найти свой идентификатор imageView из макета

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);

3) вернуть раздутый макет

return ll;
2 голосов
/ 20 мая 2016

Надо надуть взгляд

public class TestClass extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v
}}
1 голос
/ 06 ноября 2018

getView() работает только после завершения onCreateView(), поэтому вызывайте его с onPostCreate():

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
...