Probleme mit dem onClickListener

  • Antworten:13
yugox
  • Forum-Beiträge: 27

22.05.2018, 09:33:38 via Website

Moin, irgendwie greift der OnclickListener nicht auf meine Buttons, woran kann das liegen?

Folgender Vorgang, nach dem Klick auf Button1 sollen andere Buttons ein OnclickListener erhalten, aber irgendwie passiert nichts beim klicken.

hier der Code:

          case R.id.item_switch:
            if (!itemService.isActive()) {
                itemSwitch.setBackgroundResource(R.drawable.letter_switch_active);
                itemService.setItemAcitve(true);
                activateItemSwitchListener();
            }
           case R.id.btnField_00:
            tvScore.setText("DRIN");
            break;


private void activateItemSwitchListener() {
    Button[][] btnFields = gameCore.getBtnFields();
    for (int i = 0; i < btnFields[0].length; i++) {
        for (int j = 0; j < btnFields[1].length; j++) {

            String btnID = "btnField_" + i + j;
            int resID = getResources().getIdentifier(btnID,
                    "id", getPackageName());

            Button currentBtn = btnFields[i][j].findViewById(resID);
            currentBtn.setOnClickListener(this);
        }
    }
}

noch eine Frage an der Stelle " setOnClickListener(this); "

Ist "this" = das layout in denen sich die Buttons befinden oder das Layout der Activity?

— geändert am 22.05.2018, 10:27:26

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 11:27:26 via Website

Hallo

Versuche es mal so

Button currentBtn = (Button) findViewById(resID);
currentBtn.setOnClickListener(this);

Sind die Button auch im Layout enthalten?

Übrigens sollte nach jedem case ein break folgen.

btnFields[0].length; ist nicht vollständig wo ist der zweite Wert in den klammern.?

getResources().getIdentifier(btnID, "id", getPackageName());
Was steht in btnID? Sollte" R. Id...... "sein sonst wird die id nicht zurückgegeben.
This ist in diesem Fall der context auf die Activity. Geht aber nur wenn du den clicklistner als Interface implentirt hast.

— geändert am 22.05.2018, 11:57:19

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 12:07:35 via Website

Hey Jokel mein Freund :)

Button currentBtn = (Button) findViewById(resID);
currentBtn.setOnClickListener(this);

funktioniert leider auch nicht.

Übrigens sollte nach jedem case ein break folgen.

da ist auch ein break drin, hatte ich nur vergessen mitzukopieren ;)

btnFields[0].length; ist nicht vollständig wo ist der zweite Wert in den klammern.?
Die Länge des ersten Wertes, des Arrays, reicht aus, die Schleife wird auch richtig durchgegangen.

getResources().getIdentifier(btnID, "id", getPackageName());
Was steht in btnID? Sollte" R. Id...... "sein sonst wird die id nicht zurückgegeben.

String btnID = "btnField_" + i + j; = btnField_00, btnField_01, etc.
und "id" ist schon korrekt. Ich verwende dies öfters auch bei anderen Stellen und dort funktioniert es auch so.

Irgendwie scheinen die Buttons aber nicht in den Clicklistener hinzugefügt zu werden. Ich kann klicken soviel ich will, "onClick" Methode reagiert gar nicht auf diese klicks.

Die Buttons werden aber auch woanders dynamisch erzeugt, aber ich entnehme Sie ja über die Getter-Methode.

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 12:17:26 via Website

Wo werden die Button erzeugt. Und wie. Dachte die wären in der Main activity.
Wird den überhaupt die id gefunden?
Zeige mal wo du die Button erstellst.

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 12:39:30 via Website

btnFields = new Button[firstFieldDimension][secondFieldDimension];
for (int i = 0; i < firstFieldDimension; i++) {
LinearLayout layout = new LinearLayout(this.activity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1.0f);
lp.setMargins(5, 0, 5, 0);
layout.setLayoutParams(lp);

        for (int j = 0; j < this.secondFieldDimension; j++) {
            btnField = new Button(this.activity);
            btnField.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
            btnField.setTextSize(0);
            btnField.setBackgroundResource(R.drawable.clearfield);

            String buttonID = "btnField_" + i + j;
            int resID = this.activity.getResources().getIdentifier(buttonID,
                    "id", this.activity.getPackageName());
            btnField.setId(resID);

            btnField.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    gestureDetector.onTouchEvent(motionEvent);
                    return true;
                }
            });

            layout.addView(btnField);

            btnFields[i][j] = btnField;
        }
        layout2.addView(layout);

also in einer noch anderen Klasse arbeite ich auch mit den Buttons und dort werden Sie auch gefunden.

— geändert am 22.05.2018, 12:42:14

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 15:31:24 via Website

Hi
Du setzt doch schon einen Listner in der for schleife. Wie so dann noch einen?
In welcher Klasse ist den der Code?

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 15:39:02 via Website

Das eine ist doch ein TouchListener und das andere ein OnclickListener, also zwei verschiedene oder geht das nicht?

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 15:46:10 via Website

Weiß ich nicht ob das geht mit zwein. Nur wofür brachst du den TouchListner? Scheint mir keine Funktion zu haben.
Und vorallen in welcher Klasse ist das ?
Arbeitest du mit Fragmenten ?

— geändert am 22.05.2018, 15:48:44

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 15:58:53 via Website

Ich brauche den TouchListener auf den Buttons weil es auf einem LinearLayout scheinbar nicht funktioniert. Würde nur gehen wenn ich RelativLayout verwenden würde, aber dann passt es nicht vom Design.

Nur wofür brachst du den TouchListner? Scheint mir keine Funktion zu haben.
die haben schon eine Funktion

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 16:03:34 via Website

Ja aber meine Frage hast du wieder nicht beantwortet.
Ich frage das nicht ohne Grund. Wo erstellst du die Button in der MainActivity In einen Fragment oder einer Sigelton Klasse .... ohne die Kalassen Definition komme ich nicht weiter das ist für mich wichtig.
Ich wüste gern die Strucktur.
wo ist den die Onklick Methode mit den viellen Case der einzelnen Button.
Mit wo meine ich immer die Klasse.
werden die Button Überhaupt angezeigt.
Bitte antworte auf meine Fragen.
Du kennst deinen Code ich nicht.

— geändert am 22.05.2018, 16:11:55

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 16:24:34 via Website

Hat sich erledigt danke!

Geht scheinbar nur ein Listener.

— geändert am 22.05.2018, 16:24:47

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 16:27:12 via Website

Ja weil du ihn nicht an die Super Klasse zurückgibst.

Antworten
yugox
  • Forum-Beiträge: 27

22.05.2018, 17:29:27 via Website

Ist es denn irgendwie möglich einem LinearLayout ein onFling event zu geben?

Antworten
Jokel
  • Forum-Beiträge: 1.537

22.05.2018, 18:06:46 via Website

Du könntest einen OnGestureListener setzen und es selber auswerten.
https://developer.android.com/reference/android/view/GestureDetector.OnGestureListener
einen onTouchEvent hast du ja schon.

ScaleGestureDetector mScaleDetector;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());

public boolean onTouchEvent (MotionEvent ev) {

mScaleDetector.onTouchEvent(ev);

final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {

    break;
}

}}

protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {

    return true;
}

}

Antworten