Button Onclicklistener tötet meine APp

  • Antworten:28
max petersen
  • Forum-Beiträge: 14

14.05.2014, 18:28:30 via Website

Hey leute die Überschrfit klingt zwar komisch aber es ist echt so : sobald ich den button1 mit einem listener verbinde stürzt die app sofort beim Start.. alles andere im Code ist ok --> führt also zu keinen Komplikationen ausser der Button
Woran liegt das ich teste es jetzt seit 2 stunden bin am verzweifeln ..

import android.app.AlertDialog;

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
 Button button1 = (Button) findViewById(R.id.button1);
 button1.setOnClickListener(new Button.OnClickListener() {
       @Override public void onClick(View v) {
     AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(MainActivity.this);

     dlgAlert.setMessage("wrong password or username");
     dlgAlert.setTitle("Error Message...");

     dlgAlert.setCancelable(true);
     dlgAlert.create().show();




        }
    });

ich möchte doch nur, dass wenn auf den button geklickt wird eine messagebox( allertdialog) erscheint
Ist das zu schwer oder was ? :) Sorry bin echt fertig von dem Problem, komme einfach nicht dahinter

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.05.2014, 19:41:12 via Website

Was sagt denn LogCat dazu?
und man benutzt das so nicht:
AlertDialog.Builder dlgAlert = new AlertDialog.Builder(MainActivity.this);

sondern

AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);

nur this für die Aktuelle klasse

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

Antworten
impjor
  • Forum-Beiträge: 1.793

14.05.2014, 21:51:55 via App

Pascal P.

und man benutzt das so nicht:
AlertDialog.Builder dlgAlert = new AlertDialog.Builder(MainActivity.this);

sondern

AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);

nur this für die Aktuelle klasse

MainActivity. this wird benötigt. Ohne das, bezieht sich this auf die aktuelle Klasse, was in diesem Fall der OnClickListener ist.

— geändert am 14.05.2014, 21:52:07

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

max petersen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.05.2014, 06:58:49 via App

Oh sorry das hatte ich übersehen. Das das im onClck listener dann anders ist.
Ich lagere sowas immer in funktionen aus.

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

impjorFabian Simon

Antworten
Martin
  • Forum-Beiträge: 756

15.05.2014, 19:25:44 via App

Poste mal den LogCat Fehler - verwendest du den Button sonst noch irgendwo?

Antworten
Dominic Theis
  • Forum-Beiträge: 6

15.05.2014, 21:27:55 via Website

Änder mal

button1.setOnClickListener(new Button.OnClickListener() {

um in

button1.setOnClickListener(new View.OnClickListener() {

Antworten
Sven R.
  • Forum-Beiträge: 1.904

15.05.2014, 21:59:35 via App

LogCat wäre wirklich hilfreich. :)

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Martin
  • Forum-Beiträge: 756

15.05.2014, 23:21:32 via App

Stimmt - schätze mal Dominic Theis' Lösung stimmt

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 10:11:51 via Website

hoffe ihr könnt damit was anfangen.. sorry für die späte Antwort

05-16 08:10:08.465: E/AndroidRuntime(278): FATAL EXCEPTION: main

05-16 08:10:08.465: E/AndroidRuntime(278): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eeasy/com.example.eeasy.MainActivity}: java.lang.NullPointerException
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.os.Looper.loop(Looper.java:123)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-16 08:10:08.465: E/AndroidRuntime(278): at java.lang.reflect.Method.invokeNative(Native Method)
05-16 08:10:08.465: E/AndroidRuntime(278): at java.lang.reflect.Method.invoke(Method.java:521)
05-16 08:10:08.465: E/AndroidRuntime(278): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-16 08:10:08.465: E/AndroidRuntime(278): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-16 08:10:08.465: E/AndroidRuntime(278): at dalvik.system.NativeStart.main(Native Method)
05-16 08:10:08.465: E/AndroidRuntime(278): Caused by: java.lang.NullPointerException
05-16 08:10:08.465: E/AndroidRuntime(278): at com.example.eeasy.MainActivity.onCreate(MainActivity.java:26)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-16 08:10:08.465: E/AndroidRuntime(278): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-16 08:10:08.465: E/AndroidRuntime(278): ... 11 more

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 10:13:24 via Website

also trotz des Änderns in View.Onclicklistener stürzt es beim Start ab

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 10:19:38 via Website

Was steht denn da?
at com.example.eeasy.MainActivity.onCreate(MainActivity.java:26)

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

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 10:59:34 via Website

da steht das hier : button1.setOnClickListener(new View.OnClickListener() {

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 11:09:25 via Website

Im Internet findet man das:

Button clickButton = findViewById(R.id.clickButton);

clickButton.setOnClickListener( new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            ***Do what you want with the click here***
        }
    });

Da darfst du die Imports nicht vergessen.

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

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 11:34:22 via Website

wie meinst du die importe nicht vergessen eclipse weisst einen doch dann darauf hin wenn man die vergisst, oder ?
der code sieht jetzt so aus und stürzt immer noch beim öffnen ab:

package com.example.eeasy;

import android.app.AlertDialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
 Button button1 = (Button) findViewById(R.id.button1);

 button1.setOnClickListener( new OnClickListener() {

        @Override 
        public void onClick(View v) {
            // TODO Auto-generated method stub
            AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(MainActivity.this);

     dlgAlert.setMessage("wrong password or username");
     dlgAlert.setTitle("Error Message...");

     dlgAlert.setCancelable(true);
     dlgAlert.create().show();  
        }
    });




    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@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();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}

}

LOGCAT :

05-16 09:35:54.845: E/AndroidRuntime(334): FATAL EXCEPTION: main

05-16 09:35:54.845: E/AndroidRuntime(334): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eeasy/com.example.eeasy.MainActivity}: java.lang.NullPointerException
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.os.Looper.loop(Looper.java:123)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-16 09:35:54.845: E/AndroidRuntime(334): at java.lang.reflect.Method.invokeNative(Native Method)
05-16 09:35:54.845: E/AndroidRuntime(334): at java.lang.reflect.Method.invoke(Method.java:521)
05-16 09:35:54.845: E/AndroidRuntime(334): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-16 09:35:54.845: E/AndroidRuntime(334): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-16 09:35:54.845: E/AndroidRuntime(334): at dalvik.system.NativeStart.main(Native Method)
05-16 09:35:54.845: E/AndroidRuntime(334): Caused by: java.lang.NullPointerException
05-16 09:35:54.845: E/AndroidRuntime(334): at com.example.eeasy.MainActivity.onCreate(MainActivity.java:27)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-16 09:35:54.845: E/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-16 09:35:54.845: E/AndroidRuntime(334): ... 11 more

— geändert am 16.05.2014, 11:38:07

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 15:52:28 via Website

dafür gibt es einfach keine Lösung oder ?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 19:17:53 via Website

Doch es ist eine NullPointer Exception, also wird der Button nicht gefunden.
Befindet sich dieser Button auf dem Layout der activity_main.xml?
oder befindet sich dieser auf einem Fragment, wenn ja dann musst du den Listener auch in die jeweilige Fragment Klasse machen.

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

max petersen

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 19:28:04 via Website

du hast es pascal- das muss der fehler sein
ich bin beginner wie mach ich denn jetzt den Listener in die Fragment Klasse ?
Und kannst du mir auch noch sagen wieso es überhaupt diese Fragment Klasse gibt , was der Sinn von dieser Aufteilung ist :)
Endlich man danke, das muss der Fehler sein

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 20:02:53 via Website

Einfach den Listener mit dem Button findViewById etc in die Andere klasse verschieben. Und zwar in die OnCreateView Funktion.
Hier was zu den Fragments: http://www.stuermer-benjamin.de/v12_1/android-in-4-schritten-zu-fragments/

Die sind dafür, wenn du Layouts nebeneinander anordenen willst und den Code der einzelenen in eine ándere Klasse auslagen willst.
in deinem Falle brauchst du das eigentlich nicht, aber lass es drin, Fragments sind das Zukünfitge Layout, d.h. es soll verstärkt damit gearbeitet werden (von Google so gewollt):

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

max petersen

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 20:31:50 via Website

also ich kriege dann wieder Fehler, das regt mich langsam echt auf :/ Ich krieg das nicht einmal hin... so sieht die oncreateview methode aus

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
        Button button1 = (Button) findViewById(R.id.button1);

         button1.setOnClickListener( new OnClickListener() {

                @Override 
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(MainActivity.this));

             dlgAlert.setMessage("wrong password or username");
             dlgAlert.setTitle("Error Message...");

             dlgAlert.setCancelable(true);
             dlgAlert.create().show();  
                }
            });

bei findviewbyid krieg ich die Meldung, Cannot make a static reference to the non-static method Findviewbyid from the type activity
bei alertdialog.Builder krieg ich no enclosing instance of the type MainActivity is accesible in scope

hab schon gegooglet komme aber mit den lösungen nicht zurecht da krieg ich noch mehr fehler..

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 20:38:06 via Website

Ja, ein bisschen mitdenken musst du acuch nicht einfach nur Copy&Paste

  1. Du kannst keinen Code nach einem Return Statement schreiben, deswegen verschiebe dies ans ende des codes vor den schließenden Klammer.

  2. du musst nun das Layout angeben auf dem sich der Button befindet.
    Bei dir sieht das so aus: rootView.findViewById(R.id.bla);

Den AlertDialog Context musst du dann auch entsprechend verändern.

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

max petersen

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 21:07:28 via Website

hey pascal,
ja ich weiss ich sollte das nicht einfach stur kopieren, danke aber für deine tipps; jetzt sieht mein code so aus, ich habe jetzt echt 5 minuten überlegt was du mit dem vor die schließende Klammer schreiben meinst.. ich komme einfach nicht drauf -.- ` public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
        Button button1 = (Button) rootView.findViewById(R.id.button1);

Context cont = getActivity();
button1.setOnClickListener( new OnClickListener() {

                @Override 
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                   AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(cont.this));

             dlgAlert.setMessage("wrong password or username");
             dlgAlert.setTitle("Error Message...");

             dlgAlert.setCancelable(true);
             dlgAlert.create().show();   
                }
            });



    }





        }
    }`

Wieso schreibt man nach return denn den code nicht ?Wird nach return das Ablesen vom weiteren Code in der Methode abgebrochen ?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 21:19:22 via Website

Ja, nach einem Return springt der wieder in die normel main zurück, also d.h. nach ienem Return wird kein code mehr ausgeführt.
Das sagt aber das Wort an sich schon.

So jetzt zum Code:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container,
            false);

    Button button1 = (Button) rootView.findViewById(R.id.button1);

Context cont = getActivity();
button1.setOnClickListener( new OnClickListener() {
 @Override
public void onClick(View v) {
// TODO Auto-generated method stub

               AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(cont.this));

         dlgAlert.setMessage("wrong password or username");
         dlgAlert.setTitle("Error Message...");

         dlgAlert.setCancelable(true);
         dlgAlert.create().show();   
            }
        });

return rootView;
}

So sollte das passen, aber mit der Klammer meinte ich die die schließende geschweifte Funktionsklammer, damit der Compiler weiß das hier die Funktion aufhört.

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

max petersen

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 21:31:06 via Website

ok, jetzt hab ich den Fehler bekommen, dass der AlertdialogBuilder cont.this nicht akzeptiert
Ich brauch doch einen Context, den hab ich ja über Context cont = getActivity() dachte ich definiert
wie macht man dass denn sonst ?

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 21:40:10 via Website

Ok habe es durch ausprobieren gefunden DANKE NOCHMAL

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 22:20:47 via Website

jetzt aber doch noch eine Frage ... -.-
Ich habe ja den Button,.. wenn ich ihn im Emulator starte ist er an der stelle wo ich ihn möchte, perfekt
wenn ich aber die Apk auf meinem Handy starte ist der Button weiter unten, und das korrespondiert nicht mit dem Hintergrund... Woran liegt das , was kann ich da machen ?? ?

Antworten
Martin
  • Forum-Beiträge: 756

16.05.2014, 22:38:55 via App

Verwendest du ein RelativLayout ? Dann musst du die Abhängigkeit so gestalten, dass das Layout auf allen Geräten annähernd gleich aussieht - bei sehr kleinen oder sehr großen Geräten ist es sinnvoll ein eigenes Layout anzulegen

Antworten
max petersen
  • Forum-Beiträge: 14

16.05.2014, 22:41:30 via Website

Ja ich verwende ein relativelayout
Was kann ich denn da alles machen , bin anfänger..
wie kann ich ein eigenes layout machen denn ich habe ein note 3 vielleicht ist das sinnvoll..

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.05.2014, 07:44:53 via Website

Das ist das Problem mit den Unterschiedlichen Screengrößen, da ist es schwieig, dass das auf jedem Gerät exakt gleich aussieht.

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

Antworten