프래그먼트의 findViewById


1035

Fragment에서 XML로 작성한 ImageView 요소를 참조하는 Fragment에서 ImageView를 작성하려고합니다. 그러나 findViewById메소드는 Activity 클래스를 확장하는 경우에만 작동합니다. 어쨌든 Fragment에서도 사용할 수 있습니까?

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메소드는 메소드가 정의되는 것을 말한다 그것에 에러를 갖는다.


Android 용 ButterKnife 뷰 바인딩 라이브러리를 사용하십시오. 또한 작동 방식, 안드로이드 앱 개발에 통합하고 사용하여 개발 속도를 높이는 방법을 보여줍니다.
Shomu

'일부'시간이 지났지 만 여전히 답변을받지 못했습니다. 가장 도움이되는 답변을 선택하여 답변으로 표시 할 수 있습니까?
David3103

수동 findViewById
mochadwi

답변:


1433

메소드 구현시 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()방법 조각의.


323
참고 : onCreateView () 이후에만 작동합니다. 따라서 onCreate ()에서는 이것을 사용할 수 없습니다.
Dmitry Zaytsev

7
그래서 onCreate가 올바른 장소가 아닌 경우 이것을 구현하기 위해 재정의 할 수있는 기능은 무엇입니까?
Nico AD

16
ImageView팽창 된 레이아웃에서 나오는 경우 도움이되지 않습니다 . 자세한 내용은 내 대답을 참조하십시오. 그렇지 않으면 onCreateView가 @ N-AccessDev를 수행하기에 적합한 장소입니다.
MattJenko

25
이 작업을 수행하는 가장 좋은 장소는 onViewCreated 메소드
advantej

37
설명서에는 onActivityCreated()뷰에 대한 참조를 찾아 저장하는 데 권장되는 장소가 나와 있습니다. 당신은 해야한다 뒤쪽을 설정하여 이러한 저장된 참조를 정리 nullonDestroyView()하거나 누설 할 것이다 Activity.
Monstieur 2016 년

618

당신은 조각의보기와 통화를 팽창 할 필요가 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;
}

4
V.findViewById (R.id.someid)를 수행하면 팽창 된보기에있는 모든 위젯에 대해서만 작동합니다. 팽창하려고하는 imageView가 팽창 된 뷰 외부에 있으면 어떻게합니까?
Raunak

18
그런 다음 imageView를 "소유"하고 부풀린 클래스는 공개 액세스를 제공해야합니다. 그것은 매우 나쁜 습관입니다. 프래그먼트는 레이아웃에있는 UI 요소에만 액세스 할 수 있어야합니다.
LeffelMania

1
내 코드가 아닌 코드 (배경 스레드에서 UI 업데이트)에 문제가있는 것 같습니다.
LeffelMania

1
고마워, 그것은 유용했다. 관련이없는 의견 : 코드에서 Java 명명 규칙을 고수하십시오. "V"는 Java에서 변수 이름처럼 보이지 않습니다.
altumano

3
이것이 정답이어야합니다. 받아 들여진 것은 당신을 떠납니다 NullPointerException.
Machado

132

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

Fragment의 경우 항상 onViewCreated()null을 반환하거나 메서드 super.onCreateView()에서 반환하면 메서드가 자동으로 호출되지 않습니다 onCreateView(). 기본적 ListFragment으로 ListFragment반환 FrameLayout되는 경우 기본적으로 호출됩니다 .

참고 : getView()한 번 onCreateView()성공적으로 실행 하면 클래스의 어느 곳에서나 조각보기를 얻을 수 있습니다 . 즉

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

4
많은 사람들 이이 응답을 찬성하지 않은 것에 놀랐습니다. 이것은 조각에 리스너를 설정하는 올바른 방법입니다 ... 아마도 이것이 API의 새로운 개발 일 것입니다.
Sonny

사용 view에 전달 onViewCreated아직 원인 NullPointerException만 사용하는 것은 getActivity()괜찮습니다. 어떤 아이디어가 있습니까?
dVaffection

@dVaffection 조각의 onCreateView () 수명주기 메서드에서 null이 아닌 뷰를 반환하지 않을 수 있습니다. 이제 getActivity의 경우 조각 기본보기가 아닌 활동에서보기를 가져 오는 것은 전달하는 ID에 따라 다릅니다. onCreateView에서 null이 아닌보기를 반환하는지 확인하십시오. 그럼 알려주세요.
Ankur Chaudhary

@ AnkurChaudhary onCreateView메소드 에서 뷰를 반환합니다 . 방금 디버깅했으며 레이아웃이 있습니다 (제 경우 FrameLayout). 내가 요소를 찾으려고 할 때 그것은 반환 null됩니다. 왜 그런 일이?
dVaffection

@dVaffection 조각 클래스와 해당 레이아웃을 공유하십시오.
Ankur Chaudhary

66

나는 이것이 오래된 질문이라는 것을 알고 있지만, 일반적인 대답은 원하는 것을 남겨 둡니다.

이 질문은 무엇이 필요한지 명확하지 않습니다. 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;
    }
}

1
그러면 ListFragment에서 imageView를 어떻게 업데이트 하시겠습니까? FragmentManager가 필요합니까? 즉, 별도의 클래스의 onListItemClick에서 세부 조각으로 imageView를 어떻게 업데이트 할 수 있습니까?
whyoz

1
편리한 곳에 imageView에 대한 참조를 저장하거나 필요할 때 fragment.getView (). findViewById (R.id.my_image)를 저장합니다. ListFragment에서 이미지가 목록 항목에 있다고 가정하면 일반적으로 어댑터의 getView 메소드에있는 목록보기 항목의 setTag / getTag 메소드를 사용하여 참조 홀더를 작성합니다.이를 수행하는 방법에 대한 많은 예제가 있습니다.
MattJenko

47

먼저 조각보기를 얻은 다음이보기에서 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;
}

따라서 onCreate 메소드는 Fragment에서 유용합니까?
Tsunaze 2016 년

onCreateView는 프래그먼트와 관련된 뷰 계층을 생성하고 반환합니다. onCreateView는 프래그먼트의 초기 생성을 수행하기 위해 호출됩니다. 실제로, 이러한 방법으로 작성하는 내용에 따라 다릅니다.
xevincent

좋아,하지만 어떻게 onCreate에서 변수를 선언 할 수 있습니까? 보기가 onCreateView 메소드 안에 있기 때문입니다.
Tsunaze 2016 년

@Tsunaze onCreate 메소드 에서이 작업을 수행하는 방법을 찾은 적이 있습니까?
StuStirling 2016 년

1
동의한다. 이 답변은 솔루션으로 표시되어야합니다.
보리스 칼로프

25

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

가능합니다.


18

getView() 루트 뷰를 제공합니다

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

17

모든 뷰가 팽창 된 직후에 호출되는 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

Fragment클래스 내부 onViewCreated()에서 우리는 항상 뷰를 초기화 해야하는 재정의 메소드를 얻습니다 view. 이 객체를 사용하면 아래와 같이 뷰를 찾을 수 있습니다.

class MyFragment extends Fragment {
    private ImageView imageView;

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}

2
우수 잘 작동했습니다! 고마워
Vivek

15

메소드 의 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);
}

11

1) 먼저 Fragment의 레이아웃을 팽창시킨 다음 findviewbyId를 사용할 수 있습니다.

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

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

9

사용하다

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

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

작동합니다


9

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

9

노트 :

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

1
주물이 없으면 설명이 도움이되었습니다.
shaurya uppal

8

API 레벨 11의 문서에 따르면

백 스택의 참조 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

를 사용 getView()하면 조각의 뷰가 반환되고 조각 뷰의 findViewById()모든 뷰 요소에 액세스하기 위해 호출 할 수 있습니다.


3
보기는 활동이 아닙니다
Steve M

7

이것을 시도해보십시오.

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

예,이 코드 여기가 괜찮습니다. 다른쪽에 대한 편집 내용은 없습니다.
OneCricketeer 2016 년

@ cricket_007 어느 쪽이 나를 볼 수 있습니까?
Bipin Bharti

영어를 잘 못해 죄송하지만 지금은 모든 것이 고쳐졌습니다. 당신에게 보여줄 것이 없습니다.
OneCricketeer 2016 년

5

이를 구현하는 가장 좋은 방법은 다음과 같습니다.

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
}

이런 식으로 xml 레이아웃에 정의 된 각 컨트롤에 rootView를 사용할 수 있으며 코드는 훨씬 깔끔합니다.

도움이 되었기를 바랍니다 :)


나는 그것이 작동하지 않았다,이 posiible 수 thinked하지만
마이크 브라이언 올리베라에게

5

1) 레이아웃 파일을 선언하십시오.

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

2) 그런 다음 시야의 ID를 얻습니다.

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

4

gradle skeleton plugin을 사용하면 레이아웃을 참조하여 뷰 홀더 클래스를 자동으로 생성합니다.

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

이 시도:

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

return v;

4

시험

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

현장에 대한 이유가 없습니다. getView()나중에 언제든지 전화 할 수 있습니다
OneCricketeer

3

프래그먼트 내부의 메소드 내부에 findViewById()있는 활동 오브젝트로 호출 할 수 있습니다 public void onAttach(Activity activity).

예를 들어 활동을 변수에 저장하십시오.

에서 조각 클래스 : private Activity mainActivity; 에서 onAttach()방법 : this.mainActivity=activity;

마지막으로 vairable을 통해 모든 findViewById를 실행하십시오. mainActivity.findViewById(R.id.TextView);


3

onViewCreated라는 메소드가 하나 더 있습니다.

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

2

내부 onCreateView 메소드

1) 먼저 추가하려는 레이아웃 / 뷰를 팽창시켜야합니다. 선형 레이아웃

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

2) 그런 다음 레이아웃에서 imageView ID를 찾을 수 있습니다

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

3) 팽창 된 레이아웃을 반환

return ll;

이것은 LeffelMania의 답변과 동일합니다.
Reti43

2

보기를 부풀려 야합니다

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

프래그먼트에서는이 프래그먼트의 onCreateView를 만들 수 있도록 해당 창의 뷰가 필요합니다.

그런 다음보기를 가져 와서 해당보기 요소의 모든보기 ID에 액세스하십시오.

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

1) 이것이 다른 답변에 추가하는 것은 무엇입니까? 2) 두 번 응답 한 것 같습니다
OneCricketeer

2

레이아웃 팽창기가 여기에 나타납니다. Layout inflater는 Java 코드에서 XML 뷰를 사용할 수있게 해주는 클래스입니다. 따라서 다음 코드를 사용하여 변수 v의 루트 xml보기를 팽창시킬 수 있습니다. 그런 다음 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;
    }
}

1

그러한 것들을 사용하는 가장 쉬운 방법은 butterknife를 사용하는 것입니다. 이것에 의해 아래에 설명 된 것처럼 @OnClick ()만으로 많은 Onclciklistener를 추가 할 수 있습니다 :

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

다운 투표 한 이유, 이것을 사용하면 on 문에서도 여러 개의 onclick을 사용할 수 있습니다.
Amit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.