FindViewById в фрагменте

Я пытаюсь создать 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 есть ошибка, указывающая на то, что метод undefined.

Ответ 1

Используйте getView() или параметр View при реализации метода onViewCreated. Он возвращает представление корня для фрагмента (возвращаемого методом onCreateView()). С помощью этого можно вызвать findViewById().

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 

Как getView() работает только после onCreateView(), вы не можете использовать его внутри onCreate() или onCreateView() методов фрагмента.

Ответ 2

Вам нужно раздуть представление фрагмента и вызвать findViewById() в View, который он возвращает.

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

Ответ 3

Внутри класса Fragment вы получите onViewCreated() метод переопределения, где вы всегда должны инициализировать свои представления, так как в этом методе вы получаете объект просмотра используя которые вы можете найти свои взгляды, например:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);

    // or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

Всегда помните в случае фрагмента, что метод onViewCreated() не будет вызываться автоматически, если вы возвращаете метод null или super.onCreateView() из onCreateView(). Он будет вызываться по умолчанию в случае ListFragment как ListFragment return FrameLayout по умолчанию.

Примечание: вы можете получить представление фрагмента в любом месте класса, используя getView() один раз onCreateView() успешно выполнен.  то есть.

getView().findViewById("your view id");

Ответ 4

Я понимаю, что это старый вопрос, но преобладающий ответ оставляет желать лучшего.

Вопрос не ясен, что требуется от imageView - мы передаем его обратно в виде представления или просто сохраняем ссылку позже?

В любом случае, если imageView поступает из раздутого макета, правильным способом сделать это будет:

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;
    }
}

Ответ 5

Получить сначала представление фрагмента, а затем получить из этого представления свой ImageView.

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

Ответ 6

Вы также можете сделать это в методе onActivityCreated.

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}

Как они делают здесь: http://developer.android.com/reference/android/app/Fragment.html (устарело на уровне API 28)

getView().findViewById(R.id.foo);

а также

getActivity().findViewById(R.id.foo);

возможны

Ответ 7

getView() предоставит корневой вид

View v = getView().findViewByID(R.id.x); 

Ответ 8

Вы можете переопределить onViewCreated(), который вызывается сразу после того, как все представления были раздуты. Это подходящее место для заполнения переменных View. Вот пример:

class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}

Ответ 9

Метод getView() не будет работать с фрагментами вне OnCreate и аналогичными методами.

У вас есть два способа: передать представление функции в oncreate (что означает, что вы можете запускать свои функции только при создании представления) или задать представление как переменную:

private View rootView;

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

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}

Ответ 10

EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  

Ответ 11

1) сначала надуйте макет фрагмента, затем вы можете использовать findviewbyId.

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;

Ответ 12

согласен с вызовом findViewById() в представлении.

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;
}

Ответ 13

Использование getView() возвращает представление фрагмента, затем вы можете вызвать findViewById() для доступа к любому элементу вида в виде фрагмента.

Ответ 14

Согласно документации по уровню API 11

Ссылка, в Back Stack http://developer.android.com/reference/android/app/Fragment.html

короткий код

/**
 * The Fragment UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}

Ответ 15

Используйте

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

он будет работать

Ответ 16

Примечание:

Из уровня API 26 вам также не нужно специально указывать результат findViewById, поскольку он использует вывод для возвращаемого типа.

Итак, теперь вы можете просто сделать,

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}

Ответ 17

Попробуйте это, он работает для меня

public class TestClass extends Fragment {
    private ImageView imageView;

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

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}

Ответ 18

Лучший способ реализовать это:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView) rootView.findViewById(R.id.my_image);
        return rootView
}

Таким образом, rootView может использоваться для каждого элемента управления, определенного в макете xml, и таким образом код становится намного более чистым.

Надеюсь, что это поможет:)

Ответ 19

1) Объявите файл макета.

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2) Затем получите идентификатор вашего представления

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}

Ответ 20

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

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;
    }
}

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

Ответ 21

Попробуйте следующее:

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

return v;

Ответ 22

попробовать

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;
}

Ответ 23

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

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

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

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

Ответ 24

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

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}

Ответ 25

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

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

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

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

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

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

return ll;

Ответ 26

Вам нужно раздуть представление

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
}}

Ответ 27

В фрагментах нам нужно просмотреть это окно, чтобы мы сделали 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;
        }
    }

Ответ 28

Здесь представлен рисунок надувного устройства. Макет-надуватель - это класс, который позволяет нам использовать представления 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;
    }
}

Ответ 29

Самый простой способ использовать такие вещи - использовать butterknife Благодаря этому вы можете добавить столько Onclciklisteners, как только @OnClick(), как описано ниже:

public class TestClass extends Fragment {
    @BindView(R.id.my_image) ImageView imageView;
    @OnClick(R.id.my_image)
    public void my_image_click(){
        yourMethod();
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.testclassfragment, container, false);
        ButterKnife.bind(getActivity,view);
        return view;
    }
}

Ответ 30

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

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