मेरे MainActivity के अंदर मेरे 3 टुकड़े हैं और मेरे एक टुकड़े में 3 ImageView हैं और प्रत्येक छवि दृश्य वही क्रिया करता है जिसके आधार पर ImageView का चयन किया गया था, अब मैं क्या हासिल करना चाहता हूं यह है कि प्रत्येक दृश्य के लिए अलग-अलग OnClickListener का उपयोग करने के बजाय, स्विच-केस या if-else के साथ समान विधि को कॉल करें। लेकिन समस्या यह है कि ImageViews खंड के अंदर MainActivity के अंदर लागू किए गए कार्यों को कॉल नहीं कर सकते। मिसाल के तौर पर। मैं जो कहना चाहता हूं उसे समझने के लिए यहां कोड है:

मुख्य गतिविधि

public void imageClicked(View v){
    if(v.getID() == findViewById(R.id.id_of_imageView_1).getID()){
        myTextView.setText("ImageView 1 is Clicked")
    }
    
    else if(v.getID() == findViewById(R.id.id_of_imageView_2).getID()){
        myTextView.setText("ImageView 2 is Clicked")
    }

    else if(v.getID() == findViewById(R.id.id_of_imageView_3).getID()){
        myTextView.setText("ImageView 3 is Clicked")
    }
}

XML (fragment_images.xml) जहां छवियां मौजूद हैं

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/id_of_imageView_1"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_weight="1"
                android:src="@drawable/laptop" />

            <ImageView
                android:id="@+id/id_of_imageView_2"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_weight="1"
                android:src="@drawable/memory" />

            <ImageView
                android:id="@+id/id_of_imageView_3"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_weight="1"
                android:src="@drawable/screen" />

        </LinearLayout>
    </ScrollView>

एक्सएमएल (गतिविधि_मेन.एक्सएमएल) यहां मैं अपना फ्रैगमेंट और टेक्स्ट व्यू लिंक करता हूं

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

     //CHANGE THIS TEXT VIEW WHEN IMAGE IS CLICKED
     <TextView
        android:id="@+id/myTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center_horizontal"
        android:text="Select Product"
        android:textSize="20sp"
        android:textStyle="bold" />

        <fragment
            android:id="@+id/fragment_1"
            android:name="com.salmanibrahim.calssifiedelectronics.ListFrag"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            tools:layout="@layout/fragment_list" />

        <fragment
            android:id="@+id/fragment_2"
            android:name="com.salmanibrahim.calssifiedelectronics.DetailFrag"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            tools:layout="@layout/fragment_detail" />

        //THIS IS THE FRAGMENT
        <fragment
            android:id="@+id/fragment_images"
            android:name="com.salmanibrahim.calssifiedelectronics.AddProduct"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            tools:layout="@layout/fragment_images" />
    </LinearLayout>

मैं ImageView पर onClick का उपयोग करके MainActivity के अंदर परिभाषित imageClicked() को कैसे कॉल करूं?

0
Salman Malik 2 जिंदा 2021, 14:24

3 जवाब

सबसे बढ़िया उत्तर

मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं लेकिन android:onClick पैरामीटर केवल आपकी लेआउट फ़ाइल के पैरेंट टैग पर tools:context फ़ील्ड में घोषित संदर्भ के लिए लिंक करता है।

इसलिए आपके imageClicked() फंक्शन को आपके मेनएक्टिविटी में मिले फंक्शन को आपके फ्रैगमेंट के ImageView से संदर्भित करना संभव नहीं है क्योंकि वे अलग-अलग संदर्भ में हैं। अधिक जानकारी के लिए इसे देखें।

1
Kidus 2 जिंदा 2021, 19:13

अपने खंड में आप MainActivity में requireActivity() या getActivity() का उपयोग करके imageClicked() को कॉल कर सकते हैं और आवश्यक कास्ट कर सकते हैं

टुकड़े में:

public View onCreateView(...) {

    View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
    MainActivity mActivity = (MainActivity) requireActivity();

    imageView1 = view.findViewById(...);
    imageView1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mActivity.imageClicked(imageView1);
        }
    });

    
...}

ImageView2, 3 . के लिए इसे दोहराएं

साथ ही imageClicked() की स्थिति आपके findViewById की तरह सही नहीं लगती है, जो आपके MainActivity लेआउट को इंगित करेगी, खंड की नहीं।

तो आपको इसे बदलने की जरूरत है

if (v.getID() == findViewById(R.id.id_of_imageView_1).getID())

प्रति

if (v.getID() == R.id.id_of_imageView_1)

और अन्य छवियों के लिए भी ऐसा ही करें।

2
Zain 2 जिंदा 2021, 14:54

आप इसे गलत तरीके से कर रहे हैं। आप इसके बजाय ऐसा कर सकते हैं।

imageView_1.setOnClickListener(this);

फिर View.onClickListener से गतिविधि लागू करें

फिर लागू की गई विधि पर आईडी द्वारा देखें।

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.id_of_imageView_1:
            // do your things here
            break;
        }
}
0
Alireza Nezami 2 जिंदा 2021, 15:01