Wie kann ich das Onclick-Event programmgesteuert ins Android bringen?

Ich habe eine benutzerdefinierte Ansicht withe 2 Lineat Layouts: die erste ist die Ansicht der Header und die zweite ist die Detailansicht.

In der benutzerdefinierten Ansicht ist der OnClickListener des Headers Linearlayout bereits definiert: Wenn er ausgelöst wird, kollabiert er / expandiert das zweite linearelayout.

  • Ungewöhnliche Ausnahme in Firebase Runloop (3.0.0)
  • Android wie man String-Ressource in einer Java-Klasse verwenden
  • Python, Kivy und Android Spiel
  • INSTALL_FAILED_CPU_ABI_INCOMPATIBLE auf Gerät mit Intellij
  • Fit Image in ImageButton in Android
  • Wie kann ich programmgesteuert ein zweites Kind von ViewFlipper anzeigen?
  • Was ich tun möchte, besteht darin, dem OnClickListener-Event meines Headers weitere Funktionalitäten hinzuzufügen (dh: das zweite Layout zu kollabieren / zu erweitern und einen Toast zu zeigen).

    Ich kann den Quellcode der benutzerdefinierten Ansicht nicht ändern. Ich habe versucht, einen neuen OnClickListener zu setzen, aber es verbirgt das erste Ereignis (collapse / expand).

    Wie soll ich das umsetzen?

    Der Quellcode von My Custom View:

    public class ExpandoLayout extends ViewGroup { /* some declarations */ private Linearlayout header; private linearlayout footer; /* some code */ @override protected void onFinishInflate() { header= new LinearLayout(context); header.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toggleExpand(); } }); } } 

    Was ich tun möchte, ist, einen Code zu dem bereits definierten OnClickListener-Ereignis in meiner Aktivität hinzuzufügen. So ähnlich:

     public class myActivity extends Activity { private Linearlayout myCustomView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rsdetail); myCustomView= (MyCustomView) findViewById(R.id.expanded); myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(v instanceof LinearLayout) { v.performClick(); Toast.makeText(getActivity(), "ExpandoOnClickListener", 2000).show(); } } }); } 

  • Verschachtelte Fragmente verschwinden während der Übergangsanimation
  • Wie behalte ich das Seitenverhältnis auf Bildtasten in Android?
  • Verwenden von navigationView mit tabLayout
  • Pass Cookies von HttpURLConnection (java.net.CookieManager) zu WebView (android.webkit.CookieManager)
  • MediaPlayer: Sollte Untertitel-Controller bereits gesetzt haben: KitKat
  • ExpandableListView erweitert nur auf eine bestimmte Schaltfläche?
  • 4 Solutions collect form web for “Wie kann ich das Onclick-Event programmgesteuert ins Android bringen?”

    Einfache Lösung wäre es, original OnClickListener zu bekommen und dann in neuem zu schießen:

     final OnClickListener preDefinedListener = myCustomView.getChildAt(0).getOnClickListner(); myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(v instanceof LinearLayout) { preDefinedListener.onClick(v); // calls default (defined by MyCustomView) Toast.makeText(getActivity(), "ExpandoOnClickListener", 2000).show(); } } }); 

    Leider hat View nicht getOnClickListner() , aber ich vermute, Sie können Reflexion verwenden , um es zu bekommen. Es wird im Feld mOnClickListener ( source ) gespeichert.

    So können Sie OnClickListener für Ihr Layout definieren:

     OnClickListener tmpOnClickListener = null; try { Class<View> cls = (Class<View>) Class.forName("android.view.View"); Field fld = cls.getDeclaredField("mOnClickListener"); fld.setAccessible(true); // because it is protected tmpOnClickListener = (OnClickListener) fld.get(myCustomView.getChildAt(0)); fld.setAccessible(false); // restore it's original property } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } final OnClickListener preDefinedListener = tmpOnClickListener; if (preDefinedListener != null) { myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View paramView) { preDefinedListener.onClick(paramView); Toast.makeText(getActivity(), "ExpandoOnClickListener", Toast.LENGTH_LONG).show(); } }); 

    Ich habe nicht wirklich die Mühe, alle Ausnahme richtig zu behandeln, aber es ist genug, um die Idee zu bekommen. Es könnte chaotisch aussehen, aber es ist eigentlich nur 5 Zeilen neuer Code, um dein Problem zu lösen.

    Sie können das OnClickListener programmgesteuert auf eine Ansicht aufrufen, um es OnClickListener wie OnClickListener :

     view.performClick(); 

    Nun, wenn Sie dies auf Ihrem zweiten Layout unter dem ersten Layout OnClickListener dann dann hoffe, dass es die Magie tun sollte

    Seit SDK 15 kannst du einfach Methode anrufen:

     view.callOnClick() 

    Wenn Sie den Code von CustomView nicht ändern können, dann haben Sie die unten stehende Option.

    • Erweitern Sie das CustomView.
    • Überschreiben Sie die onClick () – Methode und binden Sie diese als Listener an das erste Layout.
    • Inside onClick () nennen Sie zuerst super.onClick () und fügen Sie dann Ihre zusätzliche Funktionalität unten hinzu.

    Auf diese Weise halten Sie den vorhandenen Code und fügen zusätzliche Funktionalität hinzu.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.