Problem mit On CLickListener

E

einsiedler

Neues Mitglied
0
So blöd sich dass auch anhört, ich habe absolut keine AHnung warum das nicht funktioniert. Kann mir bitte jemand helfen?

Java Code

package com.example.android.liegetest2;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class LiegeActivity extends Activity {

public int count;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_liege);
//Referenzen
RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);

final Button countbutton = (Button) findViewById(R.id.countbutton);
//on Click
countbutton.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
count++;
countbutton.setText(count);

}
});
}


@override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

}

xml code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:id="@+id/layout"
tools:context="com.example.android.liegetest2.LiegeActivity">


<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="0"
android:id="@+id/countbutton"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:textSize="40dp"


/>

</RelativeLayout>

Wieso crasht die App jedes Mal wenn man klickt, eigentlich sollte sie doch den Wert updaten.
 
Du kriegst wohl einen NullPointer weil Referenzvariable "countbutton" nur innerhalb onCreate existiert. Das kann die IDE leider nicht erkennen, das zur Laufzeit dann über null auf setText() zugegriffen wird.

Versuchs mal mit

Code:
((Button)view).setText(count);

am Besten noch zur Sicherheit eine Abfrage bevor du überhaupt etwas mit dem Parameter "view" anfängst ob es von einem Button kommt...für alle Fälle
 
sorry dass ich so blöd frage, aber wenn ich countbutton.settext(count) durch deins ersetze crasht es auch, wohin soll des und was für eine abfrage, bin da so nen kleiner noob der sich erst annähert....
 
What? Ok dann habe ich mich wohl geirrt. Meiner Ansicht nach wird die Referenz gelöscht. Der Button ist ja im Layout und das wird inflatet und sollte im Speicher sein eigentlich. Und im OnClicklistener wird doch die View die geklickt wird übergeben von daher habe ich angenommen dass falls der Button gedrückt wird eine Referenz auf den Button übergeben wird und den Text des Buttons dann ganz einfach setzen kansnt durch diese Referenz.

Kannst du mal den LogCat präsentieren. Dazu müsstest du die App mal per adb Verbinden und aus der IDE heraus auf deinem Smartphone ausführen.

Da sollte dann der Grund warum es crasht erscheinen(Filtere bitte nach E , also alles was Rot ist)

Könntest du für mich mal das hier probieren außerdem, das interessiert mich jetzt auch:

Code:
((Button) findViewById(R.id.countbutton)).setText(count);


p.s.: Hier gibt es im Editor einen Code Button mit dem du Code anzeigen kannst, sonst kriegt der User "override" heir im Forum immer Nachrichten dass er wieder mal in einem Thread markiert wurde :p
[doublepost=1452100086,1452099433][/doublepost]Achja.....mir fällt grad auf. Dadurch dass du ein Integer übergibst versucht er eine Ressource zu finden. Oh man ich könnt mich hauen :/

Hier so mal bitte probieren:

Code:
setText(""+count);

Das sollte jetzt eigentlich klappen jedoch denke ich immer noch dass du nciht die countbutton-Referenz nehmen solltest da sie für mich null ist. Gerne lasse ich mich eines Besseren belehren
 
Guck dir meine obere vorher editierte Antwort an:

android.content.res.Resources$NotFoundException: String resource ID #0x1

Dieser Fehler verschwindet dann wenn du es so machst wie ich es beschrieben habe. Er versucht eine Ressource zu finden die es aber nicht gibt ;)
 
  • Danke
Reaktionen: einsiedler
jo klappt, dankeschön:)
kannst du mir wenns nix ausmacht kurz erklären warum der eine ressource finden wollte?
 
Hi, ich kann es dir erklären.

Android arbeitet für die Mehrsprachigkeit mit den strings.xml Dateien.
Beim Kompilieren des Projekts nimmt Android die Keys der strings.xml Dateien und erstellt statische Variablen in der bekannten "R"-Datei.
Über diese Variablen kann dann auf die entsprächenden Values bei den Sprachen zugegriffen werden.

Wenn du dir jetzt die Doku für Button ansiehst, dann siehst du, dass Button von TextView erbt.
TextView hat mehre Methoden mit dem Namen "setText". Diese Methoden werden also überladen.
TextView | Android Developers[],%20int,%20int%29

Wenn du der Methode ein Integer übergibst, dann wird eine andere Methode aufgerufen, als wenn du ein String übergibst.

Bei einem Integer wird in der "R"-Klasse nach einer Referenz gesucht, bei String wird der String reingeschrieben.

So, ich hoffe das ist genau genug :)
 
  • Danke
Reaktionen: kosmus
ja das ist genau genug danke:)
[doublepost=1452108586,1452107677][/doublepost]noch ne frage
wieso funktioniert das nicht?
Code:
public int highscore;
public CharSequence highscorecharseq;
TextView highscore_value = (TextView) findViewById(R.id.highscore_value);
highscorecharseq=highscore_value.getText();
highscore=Integer.parseInt(highscorecharseq);
 
Du kannst an parseInt() nur Strings übergeben, keine CharSequence.

Code:
highscore=Integer.parseInt(highscorecharseq.toString());
 
  • Danke
Reaktionen: einsiedler
thx
 
Die Methode hilft dir weiter:

Code:
String.valueOf();
 
ich hab da noch mal ein problem, ich komm nicht mehr weiter:( verstehs einfach net. ALso die Problemstellung. Die APp startet mit der mainactivity wenn man da auf start clickt startet sich die activity2, da kann man auf einen Button clicken und so einen wert hochzählen, die CLicks werden im Text des Buttons angegeben. Wenn man auf zurück clickt, soll sich wieder die mainactivity öffnen und den highscorewert ändern, wenn der letzte clickwert höher war als der highscore.
Das Problem ist, dass es nicht klappt, ich habe schon einiges probiert, aber ich kriege entweder einen error oder es tut sich gar nix

der code der mainactivity
Code:
public class MainActivity extends Activity {
    public int highscore;
public String lastscorenewstring;
    public CharSequence highscorecharseq;
    int lastscore;
    public int lastscorenew;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //referenzen ermitteln
        TextView highscore_value = (TextView) findViewById(R.id.highscore_value);
        Button start = (Button) findViewById(R.id.startbutton);
        Button stats = (Button) findViewById(R.id.stats);
        Button settings = (Button) findViewById(R.id.settings);
        //parsemüll
        highscorecharseq=highscore_value.getText();
        highscore=Integer.parseInt(highscorecharseq.toString());
   lastscorenewstring=getliege();
lastscorenew=Integer.parseInt(lastscorenewstring);
        //onclicklistener für startbutton
        start.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //starte Liegstützactivity
                startActivity(new Intent(MainActivity.this, LiegeActivity.class));
            }
        });
if (lastscorenew!=0){
    if (lastscorenew>highscore){
        highscore_value.setText(lastscorenew);
    }
}
}
public String getliege() {
    String lastscorestring;
    Intent liege = getIntent();
    lastscorestring = liege.getStringExtra("score");

    return lastscorestring;
}

der code der zweiten activity
Code:
public class LiegeActivity extends Activity {

    public int count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_liege);
        //Referenzen
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);
         Button stop = (Button) findViewById(R.id.stop);
        ((Button) findViewById(R.id.countbutton)).setText("" + count);
        final Button countbutton = (Button) findViewById(R.id.countbutton);
        //on Click liegestütz
        countbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                count++;
                countbutton.setText("" + count);

            }
        });
        //on click zurück
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent back=new Intent(LiegeActivity.this,MainActivity.class);
              back.putExtra("score", count);
                startActivity(back);
            }
        });

    }

bitte hiiilfe:)
 
1. Ich würde mit sharedPrefs arbeiten

2. highscore_value.setText(lastscorenew);

wenn du ein Int übergibst sucht er nach einer Ressource machs wenn dann lieber so:
highscore_value.setText(""+lastscorenew);

3. Mach dafür nächstes Mal einen neuen Thread auf nachdem du den Fehler eingrenzen konntest. Dazu eignet sich den logCat zu analysieren

edit: wegen 2) habe gerade gesehen dass es heir schonmal angesprochen wurde, ich hatte doch irgendwie im Kopf dass jemand hier letztens schonmal den Fehler hatte....
 
Zuletzt bearbeitet:

Ähnliche Themen

S
Antworten
4
Aufrufe
995
Sempervivum
S
B
Antworten
4
Aufrufe
495
bb321
B
R
Antworten
3
Aufrufe
1.631
Ritartet
R
Zurück
Oben Unten