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

  • Entfernen eines OnClickListener in einer Ansicht entfernen Sie alle Berührungsereignisse auf den Ansichten hinter
  • SetOnclickListener vs OnClickListener vs View.OnClickListener
  • Wie vermeide ich mehrere Schaltflächen-Klick zur gleichen Zeit in Android?
  • Onclick listener in android
  • Wie kann ich OnClickListener in EditText zeichnen?
  • SetOnPageChangeListener ruft nicht onPageSelected auf
  • SetOnClickListener und setOnLongClickListener Aufruf bei Single-Button-Ausgabe
  • Android Klick durch PopupWindow
  • 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.