Italian url in edit text

Star-Dust

Expert
Licensed User
Longtime User
Sul sito ci sono già esempi di Label con link clickabili, belli e pronti. E' la faccenda EditText che non mi convince; consentire all'utente di inserire l'url nel db ma anche di testarlo?
Hai ragione URL in EditText non convince, c'è un modo per unire entrambi le cose?
 

Luigi S

Active Member
Licensed User
@LucaMs Si esatto, l'utente deve poter inserire e poi successivamente usare, (oltre ad eventualmente cancellare/modificare) quindi una edit text che contiene una sorta di "preferiti=URL" che diventano link dopo il salvataggio ed anche eventuali commenti ad essi che non siano link.
L'esempio di @Xfood qui #7 è perfettamente calzante
 

Luigi S

Active Member
Licensed User
Ho implementato il codice suggerito da @Sagenut aggiungendo una condizione anche per HTTP

B4X:
Private Sub Button1_Click
    Dim pieces() As String    'Prepara un array di stringhe senza definirne la grandezza
    Dim cs As CSBuilder        'Dichiarazione del CSBuilder
    cs.Initialize            'Inizializzazione CsBuilder
    pieces = Regex.Split(" ", EditText1.Text)    'Spezzetta il testo di EditText in parole singole (divide ad ogni SPAZIO) e riempie l'array
    For x = 0 To pieces.Length - 1        'Effettua un ciclo in tutto l'array e verifica se la parola inizia con WWW. o meno per capire se è un link
        If pieces(x).ToUpperCase.StartsWith("WWW.") Then    'Controlla se la parola inizia con WWW. Il ToUpperCase è per rendere tutto maiuscolo per avere solo una caso (WWW.)
            cs.Underline.Color(0xFF00D0FF).Clickable("word", pieces(x)).Append(pieces(x) & " ").PopAll    'Se la parola inizia con WWW. la aggiunge al CSBuilder come Link. "word" è il nome dell'evento che gestirà il Click sui Link. Se lo cambi devi modificare anche il nome della SUB che troverai dopo
        Else If pieces(x).ToUpperCase.StartsWith("HTTP") Then
            cs.Underline.Color(0xFF00D0FF).Clickable("word", pieces(x)).Append(pieces(x) & " ").PopAll
        Else
            cs.Color(Colors.Black).Append(pieces(x) & " ")    'Se non inizia con WWW. la aggiunge come testo semplice
        End If
    Next
    cs.PopAll    'Chiude il CSbuilder
    EditText1.Text = cs        'Assegna alla EditText il testo prodotto dal CSBuilder con i Link Cliccabili
    cs.EnableClickEvents(EditText1)        'Abilita i Link Cliccabili nel testo della EditText
End Sub

Private Sub word_Click (tag As Object)        'Questa Sub gestisce cosa deve accadere con i Link Cliccabili
    Dim url As String    'Stringa per contenere l'URL definitivo
    If tag.As(String).ToUpperCase.StartsWith("HTTP") Then    'Se il link non inizia con HTTP:// glielo aggiunge perchè altrimenti a me non si apriva il browser
        url = tag.As(String)
    Else
        url = "http://" & tag.As(String)
    End If
    Dim ph As PhoneIntents        'Questa parte fà aprire il browser al link indicato
    Dim i As Intent
    i = ph.OpenBrowser(url)
    StartActivity(i)
End Sub

il contenuto della sub Button1 l'ho messo in activity resume ottenendo quello che voglio, ma c'è un ma... siccome la edit text è multilinea, se durante la scrittura viene premuto "return" per andare a capo, invece di digitare conseguemente tutto in quanto a capo ci va automaticamente, gli URL successivi al "return" non vengono riconosciuti come LINK.
Come posso risolvere?
PS: immagino che sia il Regex che deve ignorare qualcosa come \n
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
La mia soluzione ormai è assodato che è una porcheria..... Ma finchè nessuno ti/ci propone qualcosa di più serio......
B4X:
Private Sub Button1_Click
    Dim cs As CSBuilder        'Dichiarazione del CSBuilder
    cs.Initialize            'Inizializzazione CsBuilder
    Dim carriage() As String    'Definisce un array per splittare la frase in parti che vanno a capo
    carriage = Regex.Split(CRLF, EditText1.Text)    'Splitta le parti che vanno a capo
    For n = 0 To carriage.Length - 1    'Ciclo per elaborare ogni singola parte che andava a capo
        Dim pieces() As String        'Definisce l'array per le parole del pezzo attuale
        pieces = Regex.Split(" ", carriage(n))    'Spezzetta il testo del pezzo corrente in parole singole (divide ad ogni SPAZIO) e riempie l'array
        For x = 0 To pieces.Length - 1        'Effettua un ciclo in tutto l'array e verifica se la parola inizia con WWW. o meno per capire se è un link
            If pieces(x).ToUpperCase.StartsWith("WWW.") Then    'Controlla se la parola inizia con WWW. Il ToUpperCase è per rendere tutto maiuscolo per avere solo una caso (WWW.)
                cs.Underline.Color(0xFF00D0FF).Clickable("word", pieces(x)).Append(pieces(x) & " ").PopAll    'Se la parola inizia con WWW. la aggiunge al CSBuilder come Link. "word" è il nome dell'evento che gestirà il Click sui Link. Se lo cambi devi modificare anche il nome della SUB che troverai dopo
            Else If pieces(x).ToUpperCase.StartsWith("HTTP") Then
                cs.Underline.Color(0xFF00D0FF).Clickable("word", pieces(x)).Append(pieces(x) & " ").PopAll
            Else
                cs.Color(Colors.Black).Append(pieces(x) & " ")    'Se non inizia con WWW. la aggiunge come testo semplice
            End If
        Next
        If n < carriage.Length - 1 Then cs.Append(CRLF)        'Aggiunge un Ritorno a Capo se non è l'ultimo o l'unico pezzo da elaborare
    Next
    cs.PopAll    'Chiude il CSbuilder
    EditText1.Text = cs        'Assegna alla EditText il testo prodotto dal CSBuilder con i Link Cliccabili
    cs.EnableClickEvents(EditText1)        'Abilita i Link Cliccabili nel testo della EditText
End Sub
 
Top