दिलचस्प पोस्ट
सिंगल कोट्स बनाम डबल कोट्स सी या सी ++ में कोयोनर 2 में संकलन के बराबर $ एक .NET सरणी के ऊपर? जाँच अपवादों के खिलाफ मामला एक्लिप्स के लिए सबसे अच्छी जेवीएम सेटिंग्स क्या हैं? सी # में वर्तमान पृष्ठ का URL कैसे प्राप्त करें मैं अपने ऐप में स्क्रीन कैसे रखूं? नक्शा लोड करने में विफल। Google सर्वर से संपर्क करने में त्रुटि यह शायद एक प्रमाणीकरण समस्या है एक अधिसूचना से मापदंडों को एक गतिविधि में कैसे भेजें? SecurityException फेंके बिना रनटाइम पर अनुमति की जांच कैसे की जा सकती है? एक समन्वय से नए समन्वय x मीटर और वाई डिग्री की गणना करें अक्षांश और देशांतर से पूरा पता कैसे प्राप्त करें? कैसे चर असाइन जावास्क्रिप्ट में काम करता है? मैं एक RDD को दो या अधिक RDD में कैसे विभाजित कर सकता हूं? फ़ाइल या असेंबली को लोड नहीं किया जा सका या इसके निर्भरता में से एक

टुकड़ों के अंदर XML onClick का उपयोग करके बटन क्लिक कैसे नियंत्रित करें

प्री-हनीकॉब (एंड्रॉइड 3), प्रत्येक गतिविधि को लेआउट के एक्सएमएल में onClick टैग के माध्यम से बटन क्लिक्स को नियंत्रित करने के लिए पंजीकृत किया गया था:

 android:onClick="myClickMethod" 

उस विधि के अंतर्गत आप view.getId() और बटन तर्क को करने के लिए स्विच स्टेटमेंट का उपयोग कर सकते हैं।

हनीकॉम् की शुरूआत के साथ मैं इन क्रियाकलापों को टुकड़ों में तोड़ता हूं, जो कई अलग-अलग क्रियाकलापों में पुन: उपयोग किए जा सकते हैं। बटन के अधिकांश व्यवहार गतिविधि स्वतंत्र है, और मैं हर बटन के लिए OnClickListener को दर्ज करने की पुरानी (पूर्व 1.6) विधि का उपयोग किए बिना टुकड़ों के अंदर रहने के लिए कोड OnClickListener

 final Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } }); 

समस्या यह है कि जब मेरा लेआउट बढ़ता है तो यह अभी भी होस्टिंग गतिविधि है जो बटन क्लिक प्राप्त कर रहा है, अलग-अलग टुकड़े नहीं। क्या या तो एक अच्छा दृष्टिकोण है

  • बटन क्लिक प्राप्त करने के लिए टुकड़ा पंजीकरण करें?
  • गतिविधि से क्लिक ईवेंट को उन टुकड़ों से पास करें जिन्हें वे संबंधित हैं?

वेब के समाधान से एकत्रित समाधान "टुकड़ों के अंदर XML onClick का उपयोग करके बटन क्लिक कैसे नियंत्रित करें"

आप यह कर सकते हैं:

गतिविधि:

 Fragment someFragment; //...onCreate etc instantiating your fragments public void myClickMethod(View v) { someFragment.myClickMethod(v); } 

टुकड़ा:

 public void myClickMethod(View v) { switch(v.getId()) { // Just like you were doing } } 

@ एमेन के जवाब में जो कम युग्मन चाहते थे, इसलिए टुकड़े पुनः उपयोग करने योग्य होते हैं

इंटरफेस:

 public interface XmlClickable { void myClickMethod(View v); } 

गतिविधि:

 XmlClickable someFragment; //...onCreate, etc. instantiating your fragments casting to your interface. 
 public void myClickMethod(View v) { someFragment.myClickMethod(v); } 

टुकड़ा:

 public class SomeFragment implements XmlClickable { //...onCreateView, etc. @Override public void myClickMethod(View v) { switch(v.getId()){ // Just like you were doing } } 

मैं onClick ईवेंट को प्रबंधित करने के लिए निम्न समाधान का उपयोग करना पसंद करता हूं। यह गतिविधि और टुकड़े के लिए भी काम करता है

 public class StartFragment extends Fragment implements OnClickListener{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_start, container, false); Button b = (Button) v.findViewById(R.id.StartButton); b.setOnClickListener(this); return v; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.StartButton: ... break; } } } 

मुझे लगता है कि समस्या यह है कि दृश्य अब भी गतिविधि है, टुकड़ा नहीं। टुकड़ों के अपने स्वयं के किसी भी स्वतंत्र दृष्टिकोण नहीं है और मूल गतिविधियों के दृश्य से जुड़ा है। यही वजह है कि घटना गतिविधि में समाप्त होती है, खंड नहीं। यह दुर्भाग्यपूर्ण है, लेकिन मुझे लगता है कि आपको यह काम करने के लिए कुछ कोड की आवश्यकता होगी।

मैं रूपांतरण के दौरान क्या कर रहा हूं बस एक क्लिक श्रोता को जोड़ रहा है जो पुराने ईवेंट हैंडलर को कॉल करता है

उदाहरण के लिए:

 final Button loginButton = (Button) view.findViewById(R.id.loginButton); loginButton.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { onLoginClicked(v); } }); 

मैंने हाल ही में इस समस्या का हल संदर्भ गतिविधि के लिए एक विधि जोड़ने के लिए या OnClickListener को लागू करने के बिना हल किया है मुझे यकीन नहीं है कि यह एक "मान्य" समाधान है, न कि, लेकिन यह काम करता है।

के आधार पर: https://developer.android.com/tools/data-binding/guide.html#binding_events

यह डेटा बाइंडिंग के साथ किया जा सकता है: बस एक चर के रूप में अपने टुकड़ा उदाहरण को जोड़ें, फिर आप onClick के साथ किसी भी विधि को लिंक कर सकते हैं।

 <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.testapp.fragments.CustomFragment"> <data> <variable name="fragment" type="com.example.testapp.fragments.CustomFragment"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_place_black_24dp" android:onClick="@{fragment.buttonClicked}"/> </LinearLayout> </layout> 

और टुकड़ा जोड़ने वाला कोड होगा …

 public class CustomFragment extends Fragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_person_profile, container, false); FragmentCustomBinding binding = DataBindingUtil.bind(view); binding.setFragment(this); return view; } ... } 

बटरकॉइफ़ शायद अव्यवस्था की समस्या के लिए सबसे अच्छा समाधान है। तथाकथित "पुरानी विधि" बॉयलरप्लेट कोड बनाने के लिए यह एनोटेशन प्रोसेसर का उपयोग करता है

लेकिन एक कस्टम इन्वलेटर के साथ, onClick विधि का अभी भी उपयोग किया जा सकता है।

कैसे इस्तेमाल करे

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup cnt, Bundle state) { inflater = FragmentInflatorFactory.inflatorFor(inflater, this); return inflater.inflate(R.layout.fragment_main, cnt, false); } 

कार्यान्वयन

 public class FragmentInflatorFactory implements LayoutInflater.Factory { private static final int[] sWantedAttrs = { android.R.attr.onClick }; private static final Method sOnCreateViewMethod; static { // We could duplicate its functionallity.. or just ignore its a protected method. try { Method method = LayoutInflater.class.getDeclaredMethod( "onCreateView", String.class, AttributeSet.class); method.setAccessible(true); sOnCreateViewMethod = method; } catch (NoSuchMethodException e) { // Public API: Should not happen. throw new RuntimeException(e); } } private final LayoutInflater mInflator; private final Object mFragment; public FragmentInflatorFactory(LayoutInflater delegate, Object fragment) { if (delegate == null || fragment == null) { throw new NullPointerException(); } mInflator = delegate; mFragment = fragment; } public static LayoutInflater inflatorFor(LayoutInflater original, Object fragment) { LayoutInflater inflator = original.cloneInContext(original.getContext()); FragmentInflatorFactory factory = new FragmentInflatorFactory(inflator, fragment); inflator.setFactory(factory); return inflator; } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { if ("fragment".equals(name)) { // Let the Activity ("private factory") handle it return null; } View view = null; if (name.indexOf('.') == -1) { try { view = (View) sOnCreateViewMethod.invoke(mInflator, name, attrs); } catch (IllegalAccessException e) { throw new AssertionError(e); } catch (InvocationTargetException e) { if (e.getCause() instanceof ClassNotFoundException) { return null; } throw new RuntimeException(e); } } else { try { view = mInflator.createView(name, null, attrs); } catch (ClassNotFoundException e) { return null; } } TypedArray a = context.obtainStyledAttributes(attrs, sWantedAttrs); String methodName = a.getString(0); a.recycle(); if (methodName != null) { view.setOnClickListener(new FragmentClickListener(mFragment, methodName)); } return view; } private static class FragmentClickListener implements OnClickListener { private final Object mFragment; private final String mMethodName; private Method mMethod; public FragmentClickListener(Object fragment, String methodName) { mFragment = fragment; mMethodName = methodName; } @Override public void onClick(View v) { if (mMethod == null) { Class<?> clazz = mFragment.getClass(); try { mMethod = clazz.getMethod(mMethodName, View.class); } catch (NoSuchMethodException e) { throw new IllegalStateException( "Cannot find public method " + mMethodName + "(View) on " + clazz + " for onClick"); } } try { mMethod.invoke(mFragment, v); } catch (InvocationTargetException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new AssertionError(e); } } } } 

यह एक और तरीका है:

1. इस तरह एक बेसफ़्रैगमेंट बनाएं:

 public abstract class BaseFragment extends Fragment implements OnClickListener 

2.Use

 public class FragmentA extends BaseFragment 

के बजाय

 public class FragmentA extends Fragment 

3. अपनी गतिविधि में:

 public class MainActivity extends ActionBarActivity implements OnClickListener 

तथा

 BaseFragment fragment = new FragmentA; public void onClick(View v){ fragment.onClick(v); } 

आशा करता हूँ की ये काम करेगा।

टुकड़ों के साथ काम करते समय मैं XML में onClick विशेषता का उपयोग करने के बजाय कोड में क्लिक से निपटने के लिए जाना चाहता था।

अपनी गतिविधियों को टुकड़ों तक स्थानांतरित करते समय यह अधिक आसान हो जाता है आप सीधे प्रत्येक case ब्लॉक से क्लिक हैंडलर (पहले android:onClick सेट android:onClick in XML) कॉल कर सकते हैं।

 findViewById(R.id.button_login).setOnClickListener(clickListener); ... OnClickListener clickListener = new OnClickListener() { @Override public void onClick(final View v) { switch(v.getId()) { case R.id.button_login: // Which is supposed to be called automatically in your // activity, which has now changed to a fragment. onLoginClick(v); break; case R.id.button_logout: ... } } } 

जब यह टुकड़ों में क्लिकों को संभालने की बात आती है, तो यह मेरे लिए android:onClick तुलना में सरल लगता है android:onClick

आप अपने XML लेआउट का एक विशेषता के रूप में कॉलबैक को परिभाषित कर सकते हैं। आपके कस्टम एंड्रॉइड विजेट्स के लिए आलेख कस्टम XML गुण आपको एक कस्टम विजेट के लिए यह कैसे दिखाएगा। क्रेडिट केविन डायन को जाता है 🙂

मैं जांच कर रहा हूं कि क्या मैं बेस फ्रैग्मेंट क्लास के लिए स्टाइलबल एट्रिब्यूट जोड़ सकता हूं।

मूल विचार को समान कार्यक्षमता होना चाहिए जो ऑनक्लिक कॉलबैक से निपटने के दौरान लागू होते हैं।

मेरे उपयोग के मामले में, मेरे पास 50 अजीब इमेजिव्यूज हैं जिन्हें मुझे एक ऑनक्लिक विधि में हुक करने की जरूरत थी। मेरा समाधान टुकड़ा के अंदर के विचारों पर लूप है और प्रत्येक पर उसी पर क्लिक करें श्रोता:

  final View.OnClickListener imageOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { chosenImage = ((ImageButton)v).getDrawable(); } }; ViewGroup root = (ViewGroup) getView().findViewById(R.id.imagesParentView); int childViewCount = root.getChildCount(); for (int i=0; i < childViewCount; i++){ View image = root.getChildAt(i); if (image instanceof ImageButton) { ((ImageButton)image).setOnClickListener(imageOnClickListener); } } 

Blundell के जवाब को जोड़ना,
यदि आपके पास अधिक टुकड़े हैं, तो बहुत सारे onClicks:

गतिविधि:

 Fragment someFragment1 = (Fragment)getFragmentManager().findFragmentByTag("someFragment1 "); Fragment someFragment2 = (Fragment)getFragmentManager().findFragmentByTag("someFragment2 "); Fragment someFragment3 = (Fragment)getFragmentManager().findFragmentByTag("someFragment3 "); ...onCreate etc instantiating your fragments public void myClickMethod(View v){ if (someFragment1.isVisible()) { someFragment1.myClickMethod(v); }else if(someFragment2.isVisible()){ someFragment2.myClickMethod(v); }else if(someFragment3.isVisible()){ someFragment3.myClickMethod(v); } } 

आपके टुकड़े में:

  public void myClickMethod(View v){ switch(v.getid()){ // Just like you were doing } } 

यदि आप एंड्रॉइड का उपयोग करते हुए एक्सएमएल में पंजीकरण करते हैं: ऑनक्लिक = "", सम्मानित गतिविधि को कॉलबैक दिया जाएगा जिसके संदर्भ में आपका टुकड़ा (getActivity ()) है यदि गतिविधि में ऐसी कोई विधि नहीं मिली है, तो सिस्टम एक अपवाद फेंक देगा।

आप शायद घटनाओं के लिए इवेंटबस का उपयोग करने पर विचार करना चाहें .. आप घटनाओं के लिए बहुत आसानी से सुन सकते हैं आप यह भी सुनिश्चित कर सकते हैं कि इवेंट को ui धागा पर प्राप्त किया जा रहा है (रनऑनट्रेड को कॉल करने के बजाय प्रत्येक कार्यक्रम की सदस्यता के लिए खुद के लिए)

https://github.com/greenrobot/EventBus

गिथूब से:

एंड्रॉइड ऑप्टिमाइज़्ड इवेंट बस जो क्रियाएँ, टुकड़े, थ्रेड्स, सेवाओं आदि के बीच संचार को सरल करती है। कम कोड, बेहतर गुणवत्ता

जैसे ही मुझे जवाब मिलते हैं वे किसी तरह पुराने होते हैं हाल ही में Google डेटाबिंग पेश करते हैं जो कि onClick को संभालना या आपके XML में असाइन करने के लिए बहुत आसान है।

यह एक अच्छा उदाहरण है जिसे आप यह कैसे देख सकते हैं:

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handlers" type="com.example.Handlers"/> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}" android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> </LinearLayout> </layout> 

यहां डेटाबंडिंग के बारे में भी बहुत अच्छा ट्यूटोरियल है, जिसे आप यहां पा सकते हैं।

मैं एडजॉर्न लिंकज़ के उत्तर में जोड़ना चाहता हूं।

अगर आपको कई हेन्डलर चाहिए, तो आप केवल लैम्ब्डा संदर्भ का उपयोग कर सकते हैं

 void onViewCreated(View view, Bundle savedInstanceState) { view.setOnClickListener(this::handler); } void handler(View v) { ... } 

यहां की चाल यह है कि handler पद्धति के हस्ताक्षर मैच View.OnClickListener.onClickView.OnClickListener.onClick हस्ताक्षर। इस तरह, आपको View.OnClickListener आवश्यकता नहीं होगी। View.OnClickListener इंटरफ़ेस

इसके अलावा, आपको किसी भी स्विच स्टेटमेंट की आवश्यकता नहीं होगी।

अफसोस की बात है, यह विधि केवल इंटरफेस तक सीमित है, जिसके लिए एक एकल विधि, या लैम्ब्डा की आवश्यकता होती है।

यह मेरे लिए काम कर रहा है: (एंड्रॉइड स्टूडियो)

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.update_credential, container, false); Button bt_login = (Button) rootView.findViewById(R.id.btnSend); bt_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("Hi its me"); }// end onClick }); return rootView; }// end onCreateView 

सर्वश्रेष्ठ समाधान IMHO:

टुकड़ा में:

 protected void addClick(int id) { try { getView().findViewById(id).setOnClickListener(this); } catch (Exception e) { e.printStackTrace(); } } public void onClick(View v) { if (v.getId()==R.id.myButton) { onMyButtonClick(v); } } 

फिर खंड में ओवस्टेट में संशोधित:

 addClick(R.id.myButton); 

आपकी गतिविधि कॉलबैक प्राप्त कर रही है जैसा कि आपने इस्तेमाल किया होगा:

 mViewPagerCloth.setOnClickListener((YourActivityName)getActivity()); 

यदि आप अपना टुकड़ा कॉलबैक प्राप्त करना चाहते हैं तो ऐसा करें:

 mViewPagerCloth.setOnClickListener(this); 

और onClickListener इंटरफ़ेस पर कार्यान्वित करें