Wo muss der ClickListener hin?

  • Antworten:17
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 615

24.07.2021, 17:51:12 via Website

Hallo zusammen

Meine App hat ein TabLayout welche ich je nach dem mit Fragmenten fülle.
image

Auf den Fragmenten habe ich Tabellen mit TextView. Wenn ich auf ein TextView klicke möchte ich eine Funktion ausführen. Wo muss ich mein ClickListener implementieren damit er für alle Views gültig ist?

Ich habe bereits diverses ausprobiert. In der MainActivity

class MainActivity : AppCompatActivity(), View.OnClickListener

und

   override fun onClick(v: View?) {
    var objekt = v as TextView
    var text = objekt.text.toString()
    Log.d(TAG, "->MainActivity " + text)
}

Oder direkt auf den Fragmenten. Geht ebenfalls nicht.

Oder auf der ViewPager

      page.setOnClickListener {
        var objekt = it as TextView
        var text = objekt.text.toString()
        Log.d(TAG, text)
    }

    page.setOnContextClickListener(View.OnContextClickListener { v : View ->
        var objekt = v as TextView
        var text = objekt.text.toString()
        Log.d(TAG, text)
        return@OnContextClickListener true
    })

geht beides ebenfalls nicht.

Wo muss ich mein ClickListener hintun damit es funktioniert?

Gruss Renato

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.537

31.07.2021, 15:17:33 via Website

Hallo
Dann baue dir einen custom Adapter für deine ListView. Und erstelle ein Layout für ein Listsitem so wie du es haben willst.
Hier ein einfacher link habe jetzt keinen bessern zur Hand
https://www.javatpoint.com/android-custom-listview

Jokel wie hast du das gemeint.

Was meist du?

Hilfreich?
Robbiani Renato
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

26.07.2021, 08:23:31 via Website

Moin,

du bist ja jetzt schon länger hier unterwegs :-) - dass "geht nicht" als Fehlerbeschreibung für ein Programmierer-Board etwas dürftig ist, sollte ja inzwischen aufgefallen sein :-)

Was passiert denn genau? Gibt es Fehler im LogCat? Das sollte eigentlich immer proaktiv dabei sein.

Grundsätzlich sollte der View, der die Aktion behandeln soll, auch den Listener kriegen, also musst du setOnClickListener auf dem TextView aufrufen. Also im onViewCreated des Fragments, das im ViewPager eingebettet wird.
Auf dem ViewPager zu setzen macht keinen Sinn, weil das nur ein Container ist und idR die Clicks von den Views, die er anzeigt, bereits abgefangen werden.

Hilfreich?
Pascal P.
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.07.2021, 16:18:42 via Website

Du musst den CLickListener zu jeder TextView hinzufügen.
Also entwer alle im Layout finden oder die TextViews per Code suchen etc.
Erstellst du dein Layout dynamisch?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

28.07.2021, 21:14:24 via Website

Hallo zusammen

Ich möchte eine App erstellen die folgendes macht:

Ich habe mehrere Listen. Jede Liste enthält Personen. Jede Person kann zwischen einer und maximal drei Telefonnummern haben. Wenn ich auf eine Telefonnummer tippe soll diese Nummer angerufen werden.

Habe ich 20 Personen in der Liste dann habe ich auf meiner Oberfläche 80 TextViews. Dann müsste ich 80 Clicklistener erstellen.
Diese mühe möchte ich mir ersparen. Darum habe ich mir gedacht, wenn ich einen globalen Clicklistener einrichten würde müsste ich nur noch den Inhalt der TextView auslesen und falls es eine Nummer ist anrufen.

So was habe ich bereits gemacht. In meiner NimApp habe ich 63 ImageViews und ein Clicklistener. Wenn ich auf ein Image Tippe wird er ausgeführt. Genau so wollte ich es hier ebenfalls machen.

Verwende ich aber mehrere Pages geht das offensichtlich nicht mehr. Also habe ich mich im Internet schlau gemacht und folgendes Beispiel gefunden.

for (int i = 0; i < tabLayout.getTabCount(); i++) {
final TabLayout.Tab tab = tabLayout.getTabAt(i);
final View tabView = LayoutInflater.from(this).inflate(
        R.layout.item_tab, (ViewGroup) tab.getCustomView(), false);
tabLayout.setCustomView(tabView);

final TextView customView = (TextView) tab.getCustomView();
customView.setText(mAdapter.getPageTitle(i));
final int index = i;
customView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (tabLayout.getSelectedTabPosition() == index) {
            // change edittext value
        } else {
            tab.select();
        }
    }
});

}

Leider ist dieses Beispiel in Java. Meine App erstelle ich aber in Kotlin.
Darum meine Frage hat jemand bereits so was gemacht und kann mir zeigen wie so was geht. Oder gibt es einen einfacheren weg?

Ich möchte keine 80 ClickListener erstellen müssen.

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

28.07.2021, 21:17:21 via Website

Was ich noch ergänzen möchte:

Nicht in 80 Tagen um die Welt, sondern in 80 Clicks um den Verstand!

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

29.07.2021, 09:47:14 via Website

Hallo du kannst doch auch Java in Kotlin übersettzen lassen.

Du kannst doch auch Java da sollte es dir doch auch möglich sein das in Kotlin selber zu übersetzen.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.07.2021, 11:21:55 via Website

Wie Jokel sagt, den Code in Kotlin zu übersetzen sollte kein Problem sein.
Aber ich glaube die fehlt immer noch der Zusammenhang zwischen Klick Listener und View.
Du brauchst nur einen Listener den du für alle TextViews nutzen kannst. Das macht das obere Beispiel auch.
Also was fehlt dir konkret bzw wo kommst du nicht weiter. Einfach mal schritt für Schritt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

29.07.2021, 14:49:01 via Website

Du brauchst nur einen Listener den du für alle TextViews nutzen kannst. Das macht das obere Beispiel auch.

nein ein gemeinsamer wird nicht erstellt. Die Views werden ja Dynamisch erstellt und es wird für jede View ein Listener gesetzt der eine eigene Mehode bekommt.

Habe ich 20 Personen in der Liste dann habe ich auf meiner Oberfläche 80 TextViews.

wieso machst du das mit TextViews und nicht mit einer ListView oder Recyclerview ?
was machst du wenn es 21 personen werden?

wie hast du die textviews erstellt statisch oder dynamisch zeige das mal.

— geändert am 29.07.2021, 15:06:37

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

29.07.2021, 18:13:38 via Website

Ciao Jokel

wieso machst du das mit TextViews und nicht mit einer ListView oder Recyclerview ?

Kann ich in einer ListView eine einzelne Nummer anklicken?
Ich kenne mich mit diesem Teil zu wenig gut aus. Aber ich werde es mir mal zu gemüte führen.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

29.07.2021, 19:55:16 via Website

Ja geht
Was meinst du was zb deine Kontakte Liste ist. Und kannst du da was anklicken. Also klar kannst du.

— geändert am 29.07.2021, 19:57:28

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

29.07.2021, 20:16:21 via Website

Meine Frage wie du die TextViews erstellst hast du nicht beantwortet.
Statisch im XML oder Dynamisch im Code.
Wenn Code dann wie ?

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

29.07.2021, 22:37:27 via Website

Ciao Jokel

Danke für deine Antwort. Zur Zeit habe ich alles statisch angelegt. Es wäre schon schön, wenn ich es Dynamisch machen könnte. Aber da fühle ich mich noch zu unsicher um dies zu machen. Darum habe ich mal alles statisch gemacht.

Wie ich im ersten Post geschrieben habe ist meine App wie folgt aufgebaut.
Ich habe eine Main Activity mit einer TabLayout mit zwei tabs. Die Steuerung der tabs mache ich mit einem Adapter. Die Tabs sind jeweils Fragmente welche ich in einer ViewPage darstelle.

Auf den Fragmenten habe ich eine Tabelle welche ich mit TableLayout und TableRow aufbaue. Eine TableRow enthält vier TextViews welche die Daten enthalten. (Wenn eich dich richtig verstehe könnte ich alles auch mit einer ListView machen. Das werde ich mir noch anschauen). Ich weiss nicht ob es Sinn macht wenn ich den ganzen Code hinstelle. Dies schaut sich bestimmt niemand an. Darum nur folgender Abschnitt.

Ich habe mir den Tipp von Rafael zu Herzen genommen und mit copy past den Code eingefügt. Er wird tatsächlich in Kotlin übersetzt. Wow! Habe ich nicht gewusst. Es ist folgender Code entstanden:

        for (i in 0 until (tabs.tabCount - 1)) {
        val tab = tabs.getTabAt(i)
        val tabView: View = LayoutInflater.from(this)
            .inflate(R.layout.activity_main, tab!!.customView as ViewGroup?, false)

// tabs.setCustomView(tabView)
val newView = tab!!.customView as TextView?
// customView.setText(mAdapter.getPageTitle(i))
newView!!.setOnClickListener {
if (tabs.selectedTabPosition == i) {
// change edittext value
} else {
tab!!.select()
}
}
}

Compilieren kann man den Code. Führt man ihn aus, dann kommt beim erstellen vom Clicklistener eine Nullpointer exception "newView!!.setOnClickListener". Kann mir jemand sagen warum oder was müsste ich ändern?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.537

30.07.2021, 08:28:09 via Website

Der Code wird dir so nicht viel nutzen. Du hast es ja statisch. Der dient Vileicht zum verständnis wie man es dynamisch machen kann mehr nicht.

— geändert am 30.07.2021, 08:28:32

Hilfreich?
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

30.07.2021, 08:40:51 via Website

Vielleicht ein kleiner Hack, der das Ganze auch so zum Laufen bringen würde.

Füge im Layout zum TextView ein onClick="onTelClicked" ein.

Dann gib der Activity (!) eine Funktion

fun onTelClicked(view: View) {
   val telNumber = (view as TextView).text.toString()
   ...
}
Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

31.07.2021, 12:10:57 via Website

Danke für vielen nützlichen Tipps.

Ich habe es mal mit einer ListView versucht. Klappt recht gut. Ist es möglich in der ListView mehrere Spalten zu haben. Oder muss ich für jede Spalte eine eigene ListView aufbauen? Jokel wie hast du das gemeint.

Gruss Renato

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.537

31.07.2021, 15:17:33 via Website

Hallo
Dann baue dir einen custom Adapter für deine ListView. Und erstelle ein Layout für ein Listsitem so wie du es haben willst.
Hier ein einfacher link habe jetzt keinen bessern zur Hand
https://www.javatpoint.com/android-custom-listview

Jokel wie hast du das gemeint.

Was meist du?

Hilfreich?
Robbiani Renato
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 615

31.07.2021, 16:26:55 via Website

Ciao Jokel

Alles klar. Danke für deine Antwort. Mit dem Link hast du meine Frage beantwortet.

Gruss Renato

Hilfreich?
Kommentieren