Fragment में findViewById


1035

मैं एक Fragment में एक ImageView बनाने की कोशिश कर रहा हूं, जो ImageView तत्व को संदर्भित करेगा, जो मैंने Fragment के लिए XML में बनाया है। हालाँकि, findViewByIdविधि केवल तभी काम करती है जब मैं किसी गतिविधि वर्ग का विस्तार करता हूँ। क्या ऐसा कुछ भी है, जिसका उपयोग मैं फ्रेग्मेंट में भी कर सकता हूँ?

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 viewbinding पुस्तकालय का उपयोग करें। यह भी प्रदर्शित करें कि यह कैसे काम करता है, अपने विकास को तेज करने के लिए अपने एंड्रॉइड ऐप के विकास में कैसे एकीकृत और उपयोग करें।
शोमू

'कुछ' समय बीत चुका है लेकिन आपने अभी भी एक उत्तर को स्वीकार नहीं किया है। क्या आप उस उत्तर का चयन कर सकते हैं जिसने आपकी सबसे अधिक मदद की है इसलिए इसे उत्तर के रूप में चिह्नित किया जा सकता है?
David3103

इसके बजाय डेटा बाइंडिंग ऑरंग व्यू बाइंडिंग का उपयोग मैनुअल तरीके से करने के लिए प्रोत्साहित किया जाता है। ViewById
mochadwi

जवाबों:


1433

उपयोग getView () या लागू करने से देखें पैरामीटर 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 ()
दिमित्री ज़ेत्सेव

7
तो क्या कार्य मैं इसे लागू करने के लिए ओवरराइड कर सकता है अगर ऑनक्रिएट सही जगह नहीं है?
निको ई।

16
यह मदद नहीं करता है अगर ImageViewफुलाया लेआउट से आ रहा है - विवरण के लिए मेरा जवाब देखें। अन्यथा, onCreateView यह करने के लिए सही जगह है @ N-AccessDev
MattJenko

25
ऐसा करने के लिए सबसे अच्छी जगह onViewCreated मेथड है
Argentej

37
प्रलेखन में कहा गया है कि onActivityCreated()आपके विचारों के संदर्भों को खोजने और संग्रहीत करने के लिए अनुशंसित स्थान है। आप चाहिए उन्हें वापस करने के लिए सेट करके इन संग्रहीत संदर्भ को साफ nullकरने में onDestroyView()या आप का रिसाव हो जाएगा Activity
मोंटीउर

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) करते हैं, तो निश्चित रूप से यह केवल उन सभी विजेट्स के लिए काम करेगा जो फुलाए हुए दृश्य में हैं। क्या होगा यदि वह जो चित्र देखें वह फुलाए जाने की कोशिश कर रहा है?
रौनक

18
तब वर्ग जो "मालिक" है और छवि को फुलाया है उसे सार्वजनिक पहुंच प्रदान करने की आवश्यकता है। यह बहुत बुरा अभ्यास है। टुकड़े में केवल उनके लेआउट में मौजूद UI तत्वों तक पहुंच होनी चाहिए।
लेफेलमेनिया

1
ऐसा लगता है कि आपके कोड में कुछ गड़बड़ है (पृष्ठभूमि थ्रेड से यूआई को अपडेट करना), मेरा नहीं।
लेफेलमेनिया

1
धन्यवाद, यह उपयोगी था। असंबंधित टिप्पणी के रूप में: अपने कोड में जावा नामकरण सम्मेलनों से चिपके रहने का प्रयास करें। "वी" जावा में एक चर नाम की तरह नहीं दिखता है।
अल्टुमानो

3
यह सही उत्तर होना चाहिए। स्वीकृत आप के साथ छोड़ देता है NullPointerException
मचाडो

132

इनसाइड Fragmentक्लास के अंदर आपको ओवरव्यूड () ओवरराइड विधि मिलेगी जहाँ आपको हमेशा अपने विचारों को इनिशियलाइज़ करना चाहिए क्योंकि इस पद्धति में आपको व्यू ऑब्जेक्ट मिलता है जिसके उपयोग से आप अपने विचार पा सकते हैं:

@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()यदि आप अशक्त या विधि super.onCreateView()से लौट रहे हैं तो यह विधि अपने आप नहीं कहलाएगी onCreateView()। इसे डिफ़ॉल्ट ListFragmentरूप से ListFragmentरिटर्न के रूप में कहा जाएगा FrameLayout

नोट: getView()एक बार onCreateView()सफलतापूर्वक निष्पादित होने के बाद आप कक्षा में कहीं भी खंड के दृश्य प्राप्त कर सकते हैं । अर्थात

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

4
मुझे आश्चर्य है कि बहुत से लोगों ने इस प्रतिक्रिया को नहीं बढ़ाया है - यह टुकड़ों पर श्रोताओं को सेटअप करने का सही तरीका है ... शायद यह एपीआई में एक नया विकास था।
सोनी

का उपयोग viewकरने के लिए पारित कर दिया onViewCreatedअभी भी कारण बनता है NullPointerException, लेकिन का उपयोग कर getActivity()ठीक है। कोई विचार क्यों?
dVaffection

@dVaffection यह हो सकता है कि आप oncreateView () जीवनचक्र के जीवन चक्र विधि में एक अशक्त दृश्य नहीं दे रहे हैं। अब गेटएक्टिविटी के मामले में आपको अपनी गतिविधि से विचार मिल रहे हैं बजाय खंडन के मुख्य दृश्य इस बात पर निर्भर करता है कि आप किस आईडी से गुजर रहे हैं। कृपया जांचें कि क्या आप onCreateView से कोई अशक्त दृश्य लौटा रहे हैं या नहीं? फिर मुझे बताइए।
अंकुर चौधरी

@AnkurChaudhary मैं onCreateViewविधि से दृश्य लौटाता हूं । मैंने अभी डिबग किया है और यह पता चला है कि एक लेआउट है (मेरे मामले में FrameLayout)। कहा जा रहा है कि जब मैं एक तत्व खोजने की कोशिश करता हूं तो वह लौट आता है null। क्यों हो रहा है?
dVaffection

@ वफ़ेक्शन आप अपने वर्ग के टुकड़े और इसी लेआउट को साझा कर सकते हैं।
अंकुर चौधरी

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 से एक विस्तृत खंड में छवि दृश्य कैसे अपडेट कर सकते हैं?
Whyoz

1
आप या तो छवि दृश्य के संदर्भ को कहीं भी सहेज सकते हैं, या फ़्रेग्मेंटगेट। (देखें)। FindViewById (R.id.my_image) जब आपको इसकी आवश्यकता होती है। ListFragment में, यह मानते हुए कि छवि एक सूची आइटम में है, आप आम तौर पर अपने एडाप्टर के getView पद्धति में सूची दृश्य आइटम के सेटटैग / गेटटैग विधियों के साथ एक संदर्भ धारक बनाएंगे - ऐसा करने के कई उदाहरण हैं।
मैटजेनको

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

तो, क्या फ्रैगमेंट में ऑनक्रिएट विधि उपयोगी है?
Tsunaze

onCreateView बनाता है और खंड के साथ संबद्ध पदानुक्रम दृश्य देता है। अंश का आरंभिक निर्माण करने के लिए कहा जाता है। दरअसल, यह इस बात पर निर्भर करता है कि आप इन विधियों में क्या लिखते हैं।
16:28 पर एक्सविंसेंट

ठीक है, लेकिन मैं ऑनक्रिएट में चर कैसे घोषित कर सकता हूं? क्योंकि व्यू ऑनक्रिएट व्यू पद्धति के अंदर है।
Tsunaze

@Tsunaze क्या आपको कभी पता चला है कि यह ऑनक्रीट विधि से कैसे किया जाता है?
स्टैनस्टर्लिंग

1
मैं सहमत हूँ। इस उत्तर को समाधान के रूप में चिह्नित किया जाना चाहिए।
बोरिस कार्लॉफ़

25

आप इसे onActivityCreatedमेथड में भी कर सकते हैं ।

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

जैसे वे यहां करते हैं: http://developer.android.com/reference/android/app/Fragment.html (एपीआई स्तर 28 में पदावनत)

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

तथा

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

संभव हैं।



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
उत्कृष्ट काम किया! बहुत बहुत धन्यवाद
विवेक

15

विधि getView () 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) पहले फ्रैगमेंट के लेआउट को बढ़ाएं फिर आप 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

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

ध्यान दें :

एपीआई स्तर 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
बिना कास्टिंग वाली बात ने मुझे मदद की।
शौर्य उप्पल

8

एपीआई स्तर 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
दृश्य गतिविधि नहीं है
स्टीव एम।

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

हाँ, यहाँ यह कोड ठीक है। दूसरे को आपका संपादन नहीं है।
वनक्रिटेटर

@ क्रिकेट_007 ठीक है जो आप मुझे देख सकते हैं?
बिपिन भारती

मुझे खेद है कि मैं आपकी अंग्रेजी नहीं समझ सकता, लेकिन अब सब कुछ तय हो गया है। मेरे पास आपको दिखाने के लिए कुछ भी नहीं है।
OneCricketeer

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 का उपयोग किया जा सकता है और इस तरह से कोड बहुत अधिक क्लीनर है।

उम्मीद है की यह मदद करेगा :)


मुझे लगता है कि यह सकारात्मक हो सकता है, लेकिन, यह काम नहीं किया
माइक ब्रायन ओलिवर

5

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

4

ग्रेडर कंकाल प्लगइन का उपयोग करें , यह स्वचालित रूप से आपके लेआउट के संदर्भ के साथ व्यू होल्डर कक्षाएं उत्पन्न करेगा।

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;

अंत में वायरेबल के माध्यम से प्रत्येक 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

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

2) फिर आप लेआउट से अपनी इमेज व्यू आईडी पा सकते हैं

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

3) फुलाया लेआउट लौटें

return ll;

यह LeffelMania के जवाब के समान है।
रिटि ०३

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

टुकड़ों में हमें उस विंडो के एक दृश्य की आवश्यकता होती है ताकि हम इस फ्रैगमेंट का एक ऑनक्रिएट व्यू बनाएं।

फिर दृश्य प्राप्त करें और इसका उपयोग उस दृश्य तत्वों की प्रत्येक दृश्य आईडी तक पहुँचने के लिए करें ।।

  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

लेआउट इनफ्लोटर यहाँ चित्र में आता है। लेआउट इनफ्लोटर एक वर्ग है जो हमें जावा कोड में 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

इस तरह की चीजों का उपयोग करने का सबसे आसान तरीका है मक्खन का उपयोग करना। इसके द्वारा आप केवल नीचे दिए गए @OnClick () के रूप में कई Onclciklisteners जोड़ सकते हैं:

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

वोट डाउन क्यों किया जाता है, अगर आप इसका उपयोग करते हैं, तो आप स्टेटमेंट में कई ओनलाइन भी इस्तेमाल कर सकते हैं।
अमित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.