it-swarm.com.ru

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 содержит ошибку, которая утверждает, что метод не определен.

899
simplified.

Используйте 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() фрагмента.

1307
advantej

Вам нужно раздуть представление фрагмента и вызвать 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;
}
577
LeffelMania

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

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

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

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

getView().findViewById("your view id");
123
Ankur Chaudhary

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

Вопрос не ясен, что требуется от 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;
    }
}
65
MattJenko

Сначала получите вид фрагмента, а затем получите из этого вида свой 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;
}
42
xevincent

Вы также можете сделать это в методе 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);

возможны.

22
friiky

getView() даст рут-вид

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

Вы можете переопределить 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);
    }
}
17
Lez

Метод 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);
}
14
sagits
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
10
sandhu

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

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

согласился с вызовом findViewById() в View.

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

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);
}
8
Nanda Gopal

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

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

короткий номер

/**
 * The Fragment's 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;
}
8
Dexter

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

8
Mahmoud Badri

Использование 

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

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

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

8
Manoj ahirwar

Замечания :

На уровне 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;
}
8
Novo Lucas

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

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);
    }
}
7
Bipin Bharti

Есть еще один метод, который называется onViewCreated.

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

пытаться

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;
}
5
Ramkumar.M

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

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, и в этом случае код намного чище.

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

5
Michele La Ferla

Используйте плагин 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
Ilya Gazman

Попробуй это:

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

return v;
4
AbhayBohra

Вы можете вызвать findViewById() с Activity Object вы попадаете в ваш метод public void onAttach(Activity activity) внутри вашего фрагмента.

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

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

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

3
mrSurprise

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

1) сначала нужно надуть макет/вид, который вы хотите добавить eg. 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
Devendra Kulkarni

Макет 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
Wijay Sharma

Вы должны раздуть вид

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
Surajit Mondal

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

Самый простой способ использовать такие вещи - использовать 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;
    }
}
0
Amit

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

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
0
SwiftArchitect
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;
}

Обратите внимание, что если вы используете метод getView(), это может вызвать nullPointerException, потому что он возвращает представление root и будет некоторым представлением после метода onCreateView().

0
Mahdi-Malv