onClickListener / Link für ein Wort

  • 8 Antworten
  • Letztes Antwortdatum
2

289133

Gast
Hey,

ich habe bei einer Quiz-App bei einzelnen Fragen auch Bilder, auf die sich die Frage bezieht. Anfangs war das Anzeigen der Bilder über einen ImageButton gelöst, der neben der Frage angezeigt wird, jedoch ist es ziemlich blöd, bei allen Fragen ohne Bild zB. ein "Default Bild" anzuzeigen.

Deshalb wollte ich in der Frage das Wort "Bild" quasi als Link darstellen bzw. per onCklickListener, so dass man NUR auf dieses eine Wort klicken kann, um das jpg anzuzeigen.

Den gesamten EditText als clickable="true" zu machen ist kein Problem. Aber wie kann ich nur ein einzelnes Wort "clickable" machen ?


Hoffe mir kann da jemand helfen :)

Danke schonmal
 
Hallo,
ich verstehe nicht so 100%tig was du mit "ein Wort clickable machen" meinst.
Worte tauchen in einer Anwendung nicht einfach so auf, sondern beziehen sich auf Layout-Elemente (Button, TextView, EditText, Toast, usw).

Möchtest du eine TextView anklickbar machen?
 
Das ging wohl unter, sorry.

In einer TextView steht eine Quizfrage.
Bei manchen Fragen gibt es ein Bild. An die Frage möchte ich dann etwas anhängen wie :

Zum Anzeigen des Bildes hier klicken.

Also man soll durch das Anklicken dee Wortes das Bild angezeigt werden.

Die jeweiligen Bilder befinden sich nicht online auf einer Website. Also es soll damit keine Website geöffnet werden...

Hoffe es ist alles klar ? ^^
 
Hey,

hat denn keiner eine Idee, die mir weiterhelfen könnte ? :(

Wäre jedem Beitrag echt dankbar :biggrin:
 
Code:
package com.example.myonclicktest;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.TextView.BufferType;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView t = (TextView) findViewById(R.id.helloworld);

        String myString = "Dies ist Text. Und nur dieses Wort ist anklickbar.";
        int i1 = myString.indexOf("anklickbar");
        int i2 = i1 + "anklickbar".length();
        t.setMovementMethod(LinkMovementMethod.getInstance());
        t.setText(myString, BufferType.SPANNABLE);
        Spannable mySpannable = (Spannable) t.getText();
        ClickableSpan myClickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {

                // Hier kannst Du machen was Du willst.
                // Im folgenden Beispiel wird ein Bild vom externen Speicher geöffnet.

                // Pfad zum Bild auf dem externen Speicher
                Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures"
                        + File.separator + "myonclick" + File.separator + "uploadtestfile.png"));

                if (uri != null) {
                    Log.d("SUCCESS", "Funktioniert.");
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(uri, "image/*");
                    startActivity(intent);
                } else {
                    Log.d("ERROR", "Geht nicht.");
                }
            }
        };
        mySpannable.setSpan(myClickableSpan, i1, i2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}
(Quelle)

Keine Ahnung, ob dir das hier so hilft bzw. ob Du dir das so vorgestellt hast.
Bei mir geht's jedenfalls so.
Falls Du intern aus der APK raus deine Bilder so anzeigen willst, dass hab ich nicht hingekriegt. Das müsstest Du dann selber lösen (oder es findet sich jemand.) Bilder vom externen Speicher geht jedenfalls.

Bzgl. den ursprünglichen ImageButton den Du mal hattest. Warum hast Du den nicht einfach versteckt, wenn Du eine Frage ohne Bild hattest?

Mit sowas wie:
ImageButton ib;
boolean hasImage;
....
if(!hasImage){
ib.setVisibility(View.INVISIBLE);
} else{
ib.setVisibility(View.VISIBLE);
}


Ich hoffe das hilft irgendwie. :winki:
 
Hey reallord,

danke für die Antwort. Ich werde das dann mal probieren und sehen, ob es funktioniert. Sieht aber schonmal nach genau dem aus, was ich mir vorgestellt habe.

Zu den Bildern.
Die habe ich in den drawable-Ordnern in der APK. Ist auch kein Problem. Momentan befindet sich neben der TV der ImageButton auf dem das Bild klein dargestellt ist. Somit verliere ich aber Platz für die Frage (TV), die unter Umständen sehr lang ist. Und grundsätzlich finde ich es schöner, das über den "neuen" Weg zu lösen.

So kann ich vor allem flexibler mit meinem Layout sein, weil sich die Größe der TV durch den ImageButton manchmal geändert hat je nachdem welche Maße das Bild dann hat bzw. wenn gar keins da ist.


Dürfte so also einfacher funktionieren (hoffe ich ^^).



Ich melde sobald ich das probiert habe. :)
 
Also es funktioniert alles so wie gewollt :thumbsup: Danke!

Kannst Du mir vlt. noch erklären was genau "Spannable" und "MovementMethod" machen?

Davon habe ich noch nie was gehört ...
 
Schön, das es läuft. :smile:

Zu MovementMethod:


Im Prinzip sagt Du Android, dass es (im TextView) vorhandene Links klickbar machen und bei Klick ausführen soll. Das kann man vermutlich auch über die entsprechenden Parameter im XML Layout machen, aber frag mich blos nich, welche das sind.

Beispiel:
Code:
String myString = "Dies ist Text. Und nur dieses Wort is <a href=\"http://www.google.de\">bla</> anklickbar.";
        t.setMovementMethod(LinkMovementMethod.getInstance());
        t.setText(Html.fromHtml(myString), BufferType.SPANNABLE);
//      Spannable mySpannable = (Spannable) t.getText();
//      Restlichen Code von oben der noch kommt fürs Beispiel auskommentieren
Im String ist nun mit <a href...>bla</a> ein normaler HTML Link und im t.setText() wird der nun mittels Html.fromHtml in einen Link umgewandelt.
Lässt du das setMovementMethod nun weg, hebt Android zwar weiterhin den Link hervor, beim Klicken passiert aber nichts.


Zu Spannable:
Link: Hier ist (auf englisch) ziemlich gut die Unterschiede zwischen den ganzen Text/String Klassen erklärt.

Beispiel:
Wenn Du bei einem String die Hintergrundfarbe änderst, kannst Du das nur für den kompletten String.
Mit einem Spannable kannst Du auch für Teile des Textes/Wortes andere Farben setzen.
(Natürlich kannst Du auch alle möglichen anderen Formatierungen auf Teile des Textes anwenden. Z.B. Kursiv, Fett, etc...)
Normalerweise würde man solche Formatierungen wohl mittels Html Tags und eben Html.fromHtml() machen, aber in deinem speziellen Fall brauchst Du ja das onClick() in dem Du selbst bestimmen kannst, was passiert/aufgerufen wird.

Code:
        TextView t = (TextView) findViewById(R.id.helloworld);

        String myString = "Dies ist Text. Und nur dieses Wort is <a href=\"http://www.google.de\">bla</> anklickbar.";
        int i1 = myString.indexOf("anklickbar");
        int i2 = i1 + "anklickbar".length();
//     t.setMovementMethod(LinkMovementMethod.getInstance());
        t.setText(Html.fromHtml(myString), BufferType.SPANNABLE);
        Spannable mySpannable = (Spannable) t.getText();
//      ClickableSpan myClickableSpan = new ClickableSpan() {
// ... alles auskommentieren für's Beispiel
//     mySpannable.setSpan(myClickableSpan, i1, i2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(255, 0, 255));

        // apply color change to span
        mySpannable.setSpan(fcs, i1-32, i2 -37, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Wenn das Beispiel richtig funktioniert, dann sollte nur 'klick' von anklickbar in einer anderen Farbe sein. Mit String geht das nicht.

Und das war eben genau, was Du brauchtest: Nur einen Teil eines TextViews als Link.


(Falls jemand Ergänzungen/Anmerkungen/Korrekturen hierzu hat, nur her damit. =))
 
  • Danke
Reaktionen: 289133
Wow!

Danke für die sehr ausführliche Antwort :)
Ich denke, ich habe das alles jetzt soweit verstehen können. Ansonsten weiß ich ja, wo ich nachlesen kann ^^

Dann wird ich mich jetzt meiner App widmen und sie weiter optimieren etc. :)
 
Zurück
Oben Unten