Autore Topic: Scrollare da codice un TextView contenuto in un ScrollView  (Letto 1036 volte)

Offline giannign1

  • Utente junior
  • **
  • Post: 85
  • Respect: +2
    • chiedetelo_se_lo_volete
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    giannign1
  • Sistema operativo:
    Windows 7
Scrollare da codice un TextView contenuto in un ScrollView
« il: 03 Settembre 2010, 00:54:48 CEST »
0
Dunque io ho un TextView in una ScrollView che funziona benissimo scrolla benissimo (in verticale) col dito

Ecco il codice:

Codice (XML): [Seleziona]
<ScrollView  
     android:id="@+id/ScrollViewMe"  
     android:layout_height="240dip"  
     android:layout_width="50dip"  
     android:layout_x="10dip"  
     android:layout_y="165dip">  
           
      <TextView  
     android:id="@+id/Me"  
     android:layout_height="wrap_content"  
     android:layout_width="50dip"  
     android:textColor="#000000"
     android:background="#ffffff" android:minHeight="239dip" android:gravity="right" android:paddingRight="17dip" android:text="20\n\n\n\n\n\n"/>  
</ScrollView>  

Come potete vedere All'inizio contiene solo una riga contenente il numero 20 e poi 6 righe vuote
Durante l'esecuzione del mio programma voglio inserire altre righe una dopo l'altra
e dopo un po' la situazione del mio textView potrebbe essere questa:
Off-Topic:
.20
.19
.18
.17
.16
.15
.
.
.
.
.
.

Le righe superano la dimensione della ScrollView quindi vengono un po' nascoste ma scrollando col dito riesco a vederle tutte

Fin qui tutto a posto

Avrei bisogno al termine di ogni inserimento di una nuova riga (quindi da codice) di spostare lo scroll in fondo... vedere quindi le ultime 6 righe vuote con sopra....ad esempio 17\n16\n15......quante ne vedo dipende dalla dimensione della Scrollview....
Non riesco però a spostare lo scroll da codice

Mi aiutate perfavore?

Grazie

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Scrollare da codice un TextView contenuto in un ScrollView
« Risposta #1 il: 03 Settembre 2010, 13:44:35 CEST »
0
Credo che il metodo scrollTo(int x, int y) faccia al caso tuo
ScrollView | Android Developers
Postate il LogCat LogCat LogCat LogCat LogCat

Offline giannign1

  • Utente junior
  • **
  • Post: 85
  • Respect: +2
    • chiedetelo_se_lo_volete
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    giannign1
  • Sistema operativo:
    Windows 7
Re:Scrollare da codice un TextView contenuto in un ScrollView
« Risposta #2 il: 03 Settembre 2010, 14:23:04 CEST »
0
Lo avevo provato ma mi sà che avevo sbagliato qualcosa...succede una cosa strana però:

Allora vi descrivo cosa deve succedere
ho questo textview in una scrollview con 20/n/n/n/n/n/n inizialmente
 ho ppoi un pulsante "+1" che aggiunge righe 20\n21\n22\n\n\n\n\n\n ... eccc

Unica cosa...se pigio velocemente + volte il pulsante nel giro di 1 secondo circa....scrive modifica l'ultima riga e mette direttamente il numero finale quindi se da 20\n\n\n\n\n\n pigio velocemente il pulsante, prima aggiunge la riga 20\n21\n\n\n\n\n\n mentre alla seconda pressione modifica il 21 in 22....facendo diventare il testo 20\n22\n\n\n\n\n\n

Ecco il codice:
Codice (XML): [Seleziona]
<ScrollView  
     android:id="@+id/ScrollViewMe"  
     android:layout_height="240dip"  
     android:layout_width="50dip"  
     android:layout_x="10dip"  
     android:layout_y="165dip">  
           
      <TextView  
     android:id="@+id/Me"  
     android:layout_height="wrap_content"  
     android:layout_width="50dip"  
     android:textColor="#000000"
     android:background="#ffffff" android:minHeight="239dip" android:gravity="right" android:paddingRight="17dip" android:text="20\n\n\n\n\n\n"/>  
</ScrollView>  
<Button android:layout_x="70dip" android:layout_y="164dip" android:layout_width="78dip" android:layout_height="50dip" android:id="@+id/ButtonME_P1" android:text="+1 PV" android:textSize="22dip" android:onClick="ClickPV"></Button>

Codice (Java): [Seleziona]
long lastChangeMePV=System.nanoTime();
long delayToMerge=new Long("1000000000").longValue();
....
....
....
....
public void ClickPV(View btn) {          //metodo click listener
    changePV((TextView)findViewById(R.id.Me),1);
}

public void changePV(TextView Player, int change) {
        long now = System.nanoTime(); //prendo il timestamp della chiamata
        String s;
        String precPV;
        int PV;
        if  (now - lastChangeMePV < delayToMerge){ //Se è passato poco tempo dall'ultima modifica fà il ramo Then dell IF
                s=Player.getText().toString().substring(0, Player.getText().toString().length()-6); //s diventa la stringa uguale al testo
                                                                                                                                               //del textview senza le 6 righe finali vuote
                try{
                precPV=s.substring(s.lastIndexOf('\n')+1); //in precPV recupera il numero nell'ultima riga
                s=s.substring(0,s.lastIndexOf('\n'));           //cancella da s anche quella riga
                } catch(Exception seUnaSolaRiga){            //Eccezione se c'era solo una riga(comunque è un caso improbabile che avvenga)
                        precPV=s.substring(0);
                }
                PV = new Integer(precPV).intValue() + change; //in PV ho il nuovo numero da aggiungere al textView
               
                Player.setText(s + "\n" + new Integer(PV).toString() + "\n\n\n\n\n\n", TextView.BufferType.SPANNABLE);
                Spannable str = (Spannable) Player.getText();
                str.setSpan(new StrikethroughSpan(), 0, s.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);        
                                //modificato il testodel textview aggiungendo il nuovo numero oltre le 6 righe vuote
                                //e con lo strikethrough alle rige precedenti
        } else {                //ramo else dell'IF : Assoultamente identico manca solo la riga di codice "s=s.substring(0,s.lastIndexOf('\n'));"
                                    // poichè devo aggiungere la riga lasciando la riga precedente  
                s=Player.getText().toString().substring(0, Player.getText().toString().length()-6);
                try{
                precPV=s.substring(s.lastIndexOf('\n')+1);
                } catch(Exception seUnaSolaRiga){
                        precPV=s.substring(0);
                }
                PV = new Integer(precPV).intValue() + change;
               
                Player.setText(s + "\n" + new Integer(PV).toString() + "\n\n\n\n\n\n", TextView.BufferType.SPANNABLE);
                Spannable str = (Spannable) Player.getText();
                str.setSpan(new StrikethroughSpan(), 0, s.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                
        }

         
        lastChangeMePV=now;                        //aggiorno il timestamp dell'ultima modifica
       
       
        ((ScrollView)findViewById(R.id.ScrollViewMe)).scrollTo(0, (Player.getLineCount())*Player.getLineHeight());
                                                                    //scrollo tutto in fondo il textview
    }

A questo punto succede una cosa strana:
Lo scroll avviene solo se l'esecuzione passa dal ramo Then dell'IF(anche se era scrollato verso l'alto...si sposta in fondo).
Ho controllato a Debug che i valori che passo al metodo scrollTo(int,int) sono identici passando da entrambi i rami

L'unica cosa che cambia nei 2 rami è quella riga di codice:
Codice (Java): [Seleziona]
s=s.substring(0,s.lastIndexOf('\n'));
e il fatto che nel ramo Then non modifico le dimensioni mentre nell'else di fatto aumento di una riga il textview

!!!!!!!!!!!Come mai????

Cmq per arginare il problema ho provato a modificare cosi il ClickPV(View btn)   
Codice (Java): [Seleziona]
public void ClickPV(View btn) {
    changePV((TextView)findViewById(R.id.Me),1);
    changePV((TextView)findViewById(R.id.Me),0);
}

Dopotutto se clicco 2 volte sul pulsante in meno di un secondo....chiamo 2 volte la changePV(textView,int)...
Ma così .... che faccio in pratica la stessa cosa.....non funziona....... :S

Aiutatemi
grazie
          
« Ultima modifica: 03 Settembre 2010, 15:59:54 CEST da giannign1, Reason: Ancora non funziona »

Offline giannign1

  • Utente junior
  • **
  • Post: 85
  • Respect: +2
    • chiedetelo_se_lo_volete
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    giannign1
  • Sistema operativo:
    Windows 7
Re:Scrollare da codice un TextView contenuto in un ScrollView
« Risposta #3 il: 08 Settembre 2010, 21:02:08 CEST »
0
Nessuno mi sà aiutare??? :'(