Anfänger: Button mit einfachem Link

P

PhilBlueSky

Neues Mitglied
0
Hallo Freunde,

zuallererst einmal sorry für diejenigen Profis unter Euch, die sich jetzt durch eine so dermaßen simple Anfängerfrage gestört fühlen, an Euch ist das Thema nicht gerichtet, sondern an die, die mir wirklich helfen und weiterbringen möchten, denn nur von diesen netten Leuten möchte ich lernen. :winki:

NUN, ich möchte meinen Arduino Ethernet ansprechen, per IP im Browser funktioniert das auch schon sehr gut, es erfüllt seinen Zweck. Ich bin auch dort noch kein Profi, aber ich habe eine simple Idee im Kopf, die zwar keiner braucht, ich aber für mich umsetzen möchte, damit ich mal ein paar Grundlagen lerne. Ziel ist es nun, eine kleine App zu schreiben mit ein paar Buttons, die mir eine html-Anfrage an eine IP schicken.
ALSO, die App soll nun neben dem Titel einfache Buttons erhalten, sagen wir 6 und jeder dieser Buttons soll mir eine html-Anfrage an den Arduino schicken. Den Rest erfüllt der Arduino dann. Alles soll ausschliesslich im eigenen WLAN passieren.
MEINE Kenntnise im SDK und Eclipse sind absolut anfänglich, SDK und Eclipse ist aber Up and Running. Meine Java-Programmierung beschränkt sich nur auf die nötigsten Runtime-Updates für den Browser... :thumbsup:
JETZT meine Frage, ist dies überhaupt möglich und wenn ja, kann mir jemand Hilfe dazu geben? Gerne auch per Skype etc. wenn gewünscht. Google und diverse SuFu´s verwirren mich zu sehr, da bin ich immer Stunden unterwegs für die einfachsten Sachen und um meine Ideen umzusetzen.
Ich sage jetzt schonmal Danke für hilfreiche Kommentare und freue mich schon jetzt, diese dann auch umzusetzen.
 
Ohne dir zu nahe treten zu wollen, aber ohne Grundlagen-Kenntnisse wirst du wahrscheinlich nicht weit kommen. Wenn dich jetzt jemand per Skype Schritt für Schritt anleiten wollte, dann würde das 5 mal so lang dauern als einfach die App selbst zu schreiben.

Sieh doch erst mal zu, dass du ein einfaches SDK Beispiel zum Laufen bekommst. Dann packst du in das Layout zusätzliche Buttons und versiehst die mit onClickListenern, die irgendwas simples machen. Wenn das soweit läuft, müsstest du die HTTP Requests asynchron machen, also in einem Thread oder AsyncTask (um den UI Thread nicht zu blockieren), aber so ganz trivial ist das nicht.
 
Hi Mike,

danke für Deine Antwort und damit trittst Du mir nicht zu nahe. Jedenfalls sind in Deiner Antwort schonmal ein paar Begriffe, nach denen ich suchen kann. Im Moment spiele ich im Eclipse herum, ist aber wirklich entmutigend und kompliziert. Nebenbei spiele ich auch im App Inventor, was mich nun schon etwas weiter gebracht hat und ich schon bei der Eingabe der IP bzw. URL bin, was bei Button-Betätigung geschehen soll. Leider blinkt aber die LED nicht. :crying::thumbup:
Jaja, schmunzelt nur... :tongue::lol:
Jedenfalls bin ich eher derjenige, der gleich auf das Ziel hinarbeiten möchte und sozusagen learning by doing mache.
Aber vielleicht hast Du recht, leider sieht die App in meinem Kopf ziemlich einfach aus, aber es ist wohl nicht so einfach. Fakt ist eben, daß diese App nur 6 Buttons enthalten soll und jeder Button soll eben eine Anfrage an eine html-adresse schicken, ohne sonst irgendwelche Aktionen auszuführen. Buttons erstellen ist ja so nicht mehr DAS Problem...
 
Sehr nette Einleitung - da antwortet man gerne! :)

Die Aufgabe ist aus Android-Sicht ziemlich simpel (sieht man mal vom dem Eclipse- und XML-Layout-Gedöhns zu Beginn ab). Aus Java-Sicht hingegen nicht so sehr (auch wenn du dir die nötigen Code-Schnippsel leicht aus dem Internet zusammenklauben kannst).

Drei Sachen, die ich dir hier empfehlen kann:
Android-Tutorial
Oracle-Network-Tutorial
Painless threading - Android Blogspot

Viel Glück/Spaß, und nicht gleich aufgeben!
 
Zuletzt bearbeitet:
Hi funglejunk,

wow, vielen Dank für die Links, obwohl sie doch auf den ersten Blick mit viel Text und englisch recht trocken aussehen, aber ich werde mich sicherlich mal einlesen. Fakt ist halt, daß ich viel Praxis brauche, mit viel Theorie hab ich es nicht so. Da gebe ich immer ziemlich schnell auf.
Auf der anderen Seite habe ich das Problem, daß mir das Android alleine als Betriebssystem eines Handys nicht mehr reicht. Ich will einfach den ersten Schritt in die Automation (wenn auch nur Homeautomation) wagen, wusste aber nicht, daß es doch so schwierig ist, eine simple Anfrage auf einen Android-Button zu legen. Ich dachte eher, Variable eingeben und fertig. :unsure:
 
Ich hab dir jetzt mal ein lauffähiges Beispiel gebastelt. Das Eclipse Projekt kannst du hier runterladen: 6Buttons.zip (130,11 KB) - uploaded.to
Danach in Eclipse: File -> Import -> General -> Existing projects into workspace -> Select archive file -> 6Buttons.zip

So sieht es aus:

2yo27p2.png


Und das ist der Code von MainActivity:

Code:
package com.example.buttons;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.button3);
        Button button4 = (Button) findViewById(R.id.button4);
        Button button5 = (Button) findViewById(R.id.button5);
        Button button6 = (Button) findViewById(R.id.button6);
        
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                showToast("Button 1 gedrückt");
                
            }});
        
        
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                showToast("Button 2 gedrückt");
                
            }});
        
    }
    
    private void showToast(String msg) {
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Du musst jetzt eigentlich nur noch die OnClickListener der anderen Buttons ergänzen und deine Sachen in die onClick() Methode schreiben.
 
Wow Mike, das ist mehr, als ich erwartet hätte. Das mir jemand das coden anfängt, hätte ich nie verlangt, vielen Dank! Du siehst mich grad mit der Nase am Screen kleben und die MainActivity analysieren, ja? Trotzdem stehe ich als Ochse vor dem Berg...
Ich bin weder gut in PHP, noch in Java, eigentlich schlechter, sozusagen gar nix, trotzdem sehe ich einen Haufen Variablen. Verstehe mich nicht falsch, ich lerne liebend gern am "lebenden Objekt", am Beispiel, mir macht das Spaß, vor allem, wenn sich was bewegt, aber finde mal jemand, der das mitmacht.
Die restlichen Buttons hinzufügen ist ja copy-paste und anpassen, aber wo schreibe ich den Link bzw. die IP rein? Das Layout ist ja kein Problem soweit, damit komme ich klar. Ich will aber dem Button sagen, wenn ich draufdrücke, soll er mir z.b. xx.xx.xx.xx/?y anfragen/anpingen. Das kommt dann am Arduino an und dieser gibt mir dann einen Impuls oder was auch immer ich dann programmiere.

Edit: Ich lerne gerade mit den Links von funglejunk und dem Programm von Mike_SD und muss sagen, is ja mal n nettes Spielzeug. Mikes App funktioniert gut auf meinem Smarty, jetzt muss der Button nur noch die IP anfunken und dann bin ich glücklich. Wisst Ihr eigentlich, wie mächtig das wäre, wenn man das umsetzen könnte? Android verbunden mit Arduino...
 
Zuletzt bearbeitet:
Hab mal Kommentare ergänzt, und der zweite Button ruft jetzt den Browser auf:

Code:
package com.example.buttons;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    
    //onCreate() wird ausgeführt wenn die App startet
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //Der super Aufruf gehört hier hin, weil wir die Klasse Activity erweitern
        super.onCreate(savedInstanceState);
        //Hier sagen wir, welches Layout für diese Activity verwendet werden soll, also activity_main.xml
        setContentView(R.layout.activity_main);
        
        //Als nächstes erstellen wir Button Objekte und verknüpfen sie mit den Buttons im Layout
        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.button3);
        Button button4 = (Button) findViewById(R.id.button4);
        Button button5 = (Button) findViewById(R.id.button5);
        Button button6 = (Button) findViewById(R.id.button6);
        
        //Dieser Button bekommt jetzt einen OnClickListener(). Der wird beim einem Buttonklick ausgeführt
        button1.setOnClickListener(new OnClickListener() {

            //onClick() wird ausgeführt, wenn der Button geklickt wird
            @Override
            public void onClick(View v) {
                
                //Momentan zeigen wir nur eine kleine Nachricht hier mittels showToast(), aber hier kämen dann die eigentlichen Aktionen rein
                showToast("Button 1 gedrückt");
                
            }});
        
        
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                Uri uriUrl = Uri.parse("http://www.google.com/");
                Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
                startActivity(launchBrowser);
                
            }});
        
    }
    
    //Hilfsmethode um Toast Nachrichten etwas bequemer erstellen zu können
    private void showToast(String msg) {
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
    

    //Uninteressant, betrifft das Options Menü, das beim Druck auf die Menütaste des Geräts auf geht
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Normalerweise würde man so einen HTTP Request wahrscheinlich im App selbst machen statt einfach die Browser mit der URL aufzurufen, aber das ist für einen Anfänger gar nicht mal so unkompliziert, daher hab ich hier die einfache Variante genommen.
 
Ahh, vielen Dank, habe es auch schon drin und Du hast das schön gemacht, daß Du nur den 2ten Button angepasst hast, so sehe ich den Unterschied und habe es auch sehr gut verstanden. Aufm Smarty funktioniert es auch schon, wie es soll.
Kannst Du mir trotzdem noch den Gefallen tun und vielleicht den 3ten Button so anpassen, daß er das in der App macht, ohne den Browser zu öffnen? Ungeachtet dessen, ob es für einen Anfänger schwer ist, oder nicht, aber ich würde gerne einmal den Code sehen. Vielleicht komme ich gleich hinter die Logik. Eben einfach nur mal zu sehen, wie es aussehen würde, müsste und was passiert.
Ich glaube, danach reicht es auch für heute, habe ja noch die anderen Links vor mir. Gehe auch nebenbei gerade die Schule developer.android.com durch und sonst wird es dann zuviel.
 
Code:
package com.example.buttons;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    
    private TextView textview1;

    //onCreate() wird ausgeführt wenn die App startet
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //Der super Aufruf gehört hier hin, weil wir die Klasse Activity erweitern
        super.onCreate(savedInstanceState);
        //Hier sagen wir, welches Layout für diese Activity verwendet werden soll, also activity_main.xml
        setContentView(R.layout.activity_main);
        
        textview1 = (TextView) findViewById(R.id.textView1);
        
        //Als nächstes erstellen wir Button Objekte und verknüpfen sie mit den Buttons im Layout
        Button button1 = (Button) findViewById(R.id.button1);
        Button button2 = (Button) findViewById(R.id.button2);
        Button button3 = (Button) findViewById(R.id.button3);
        Button button4 = (Button) findViewById(R.id.button4);
        Button button5 = (Button) findViewById(R.id.button5);
        Button button6 = (Button) findViewById(R.id.button6);
        
        //Dieser Button bekommt jetzt einen OnClickListener(). Der wird beim einem Buttonklick ausgeführt
        button1.setOnClickListener(new OnClickListener() {

            //onClick() wird ausgeführt, wenn der Button geklickt wird
            @Override
            public void onClick(View v) {
                
                //Momentan zeigen wir nur eine kleine Nachricht hier mittels showToast(), aber hier kämen dann die eigentlichen Aktionen rein
                showToast("Button 1 gedrückt");
                
            }});
        
        
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
                Uri uriUrl = Uri.parse("http://www.google.com/");
                Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
                startActivity(launchBrowser);
                
            }});
        
        button3.setOnClickListener(new OnClickListener() {

            //onClick() wird ausgeführt, wenn der Button geklickt wird
            @Override
            public void onClick(View v) {
                
                new HTTPTask().execute("http://www.google.com");
                
            }});
        
    }
    
    //Hilfsmethode um Toast Nachrichten etwas bequemer erstellen zu können
    private void showToast(String msg) {
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
    
    public class HTTPTask extends AsyncTask<String, Void, String>{

        public String doInBackground(String... urls){
            String url = urls[0];

            String status = "";
            
            try {
                HttpClient client = new DefaultHttpClient();  
                HttpGet get = new HttpGet(url);
                HttpResponse responseGet = client.execute(get);  
                status = String.valueOf(responseGet.getStatusLine().getStatusCode() + " " + responseGet.getStatusLine().getReasonPhrase());
                
            } catch (Exception e) {
                status = "Exception occured, " + e.getMessage();
                e.printStackTrace();
            }

            return status;
        }

        public void onPostExecute(String status){
            textview1.setText("HTTP Status: " + status);
        }
    }

    //Uninteressant, betrifft das Options Menü, das beim Druck auf die Menütaste des Geräts auf geht
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
Zusätzlich muss die AndroidManifest.xml so geändert werden:

Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.buttons"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 
Wow, vielen Dank Mike, das gibt mir wahnsinnig Input. Die MainActivity habe ich jetzt mit der vorherigen verglichen, als Neuling ausgedrückt, mache ich diese quasi "serverfähig" oder "clientfähig", das sagen mir zumindest die apache-Einträge am Beginn. Der ganze Code sieht für mich auch stimmig und logisch aus, wenn ich ihn so durchgehe. Natürlich ist vieles von dem Code noch neu für mich, aber mir macht das Lernen so gerade richtig Spaß. (Fragt sich nur, wie lange :ohmy:). Die Manifest ist auch einleuchtend, da wir der App ja die Permission geben wollen/müssen, is klar.
Also erstmal vielen Dank, mehr will und kann ich nicht verlangen. Ich werde nun mal weiter die Lessons machen, mit der Zeit verstehe ich dann auch mehr, aber ich will und werde nicht da drum herumkommen. Alles andere hat wohl auch keinen Sinn, ich will ja auch niemandem auf die Nerven gehen damit. Trotzdem vielen vielen Dank, ich habe heute wieder einen großen Lernschritt gemacht. Wenn nur nicht immer die Zeit so schnell vergehen würde...:crying::winki:

Edit: Habe jetzt gerade die MainActivity geladen, da wirft er mir einen Error aus bei textview1 = (TextView) findViewById(R.id.textView1); ----> (R.id.textView1) ist unterkringelt und rot markiert. Fehlt da irgendwo eine ID oder ist es falsch geschrieben? Ich bin schon am Suchen!
 
Zuletzt bearbeitet:
Das mit der Fehlermeldung ist klar, du hast wahrscheinlich keinen TextView in deinem Layout :)
R.id.textView1 bezieht sich auf ein Element mit der ID "textView1". Da Eclipse diese ID nicht zuornden kann (sie existiert ja nicht), bekommst du eine Fehlermeldung.

PS: Bitte steinigt mich jetzt nicht, wenn ich ein paar Begriffe falsch verwende. Ich beschäftige mich auch erst seit zwei Wochen mit Android Programmierung ;-)
PPS: Ich bin auch eher der Typ, der nach dem System try&error programmiert / programmieren lernt. Leider ist es doch sehr schwer rudimentäre Codeschnipsel zu finden, wenn man nicht genau weiß was man bei Google eintippen soll und deutschsprachige Beispiele sind nahezu unauffindbar :)
 
Zuletzt bearbeitet:
Hatte den edit gar nicht gesehen. Im Layout müsste eigentlich das TextView mit drin sein, sofern du es nicht entfernt hast. Also in /res/layout/activity_main.xml sollte über den Buttons ein TextView sein, der beim Starten erst mal nur Hello World! anzeigt.

Wenn das TextView drin is und er trotzdem meckert, schau dir in der MainActivity mal die Imports ganz oben an. android.R sollte darin NICHT auftauchen. Eclipse baut das schon mal ganz gern selbstständig ein, und dann funktionieren die IDs nicht mehr.
 

Ähnliche Themen

D
Antworten
17
Aufrufe
408
datNeMo
D
MES
Antworten
10
Aufrufe
819
MES
MES
A
  • AnimaAngelo85
Antworten
1
Aufrufe
337
swa00
swa00
Zurück
Oben Unten