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.

  • Was ist ein vernünftiger Wert für SD-Kartengröße für AVDs?
  • Wie benutzt man android exoplayer
  • Android: Wie führe ich RelativeLayout auf die volle Breite des Bildschirms?
  • Strange FragmentTransaction in der FragmentLayout-Klasse aus dem ApiDemos-Beispiel
  • Zeige Helper Text unten EditText zusammen mit dem Hinweis
  • DialogFragment setCancelable property funktioniert nicht
  • 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(); } } }); } 

  • Wie kann man bestimmte Aktivitäten aus der Stack-Geschichte löschen?
  • Wie ordnungsgemäß Werte in die SQLite-Datenbank mit ContentProvider's insert () -Methode über einen CursorLoader einfügen?
  • Android Horizontale LinearLayout - Wrap Elemente
  • AccessToken-Token: ACCESS_TOKEN_REMOVED in Facebook Android SDK
  • Unterschied zwischen Zieh- und Zieh-Mdpi
  • Android Ausfahrt sqlite Shell
  • 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.