Creo e istanzio le variabili oggetto per gli elementi:
public class MainActivity extends Activity { ScrollView scrollView; RelativeLayout mainLayout; TextView textView1; TextView textView2; TextView textView3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainLayout=(RelativeLayout)findViewById(R.id.mainLayout); scrollView=(ScrollView)findViewById(R.id.scrollView); textView1=(TextView)findViewById(R.id.textView1); textView2=(TextView)findViewById(R.id.textView2); textView3=(TextView)findViewById(R.id.textView3); } }]
...e modifico la coordinata verticale di uno degli elementi per poter mettere in evidenza il comportamento della ScrollView.
<TextView
android:background="@color/nero"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_marginTop="400dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="200dp"
android:id="@+id/textView2"
android:text="@string/hello_world" />
Bene.
Ora creo un OnTouchListener per la ScrollView, che restituisca true, nel qual caso la ScrollView sarà disabilitata, o false nel qual caso la ScrollView sarà abilitata: praticamente bisogna che il listener restituisca un valore booleano contrario al fatto che la ScrollView sia abilitata o no.
Pongo il listener in un metodo privato a parte, separato dal metodo onCreate dell'Activity.
public class MainActivity extends Activity {
ScrollView scrollView;
RelativeLayout mainLayout;
TextView textView1;
TextView textView2;
TextView textView3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
scrollView=(ScrollView)findViewById(R.id.scrollView);
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2);
textView3=(TextView)findViewById(R.id.textView3);
}
private void ScrollViewEnabled(final boolean enabled){
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return !enabled;
}
});
}
}
Mettendo come parametro "true", ottengo che la funzione restituisca "false", nel qual caso la ScrollView sarà abilitata, mentre mettendo come parametro "false", la ScrollView sarà disabilitata.
Ora creo un OnTouchListener comune per le TextBox, in modo che toccando queste si disabiliti la ScrollView:
View.OnTouchListener onTouchListener=new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ScrollViewEnabled(false); return false; } }; }e attribuisco il listener a tutte e tre le TextView.
textView1.setOnTouchListener(onTouchListener);
textView2.setOnTouchListener(onTouchListener);
textView3.setOnTouchListener(onTouchListener);
E verifichiamo...
Funziona benissimo!.
La ScrollView funziona benissimo, ma quando vado a toccare una delle TextView non si ha più lo scorrimento.
Però la ScrollView continua a rimanere disabilitata anche se poi si va a toccare nuovamente la parte libera.
Provo a risolvere creando un OnTouchListener per il mainLayout, ossia per il Layout di base, e facendo sì che al touch su questo si riattivi la ScrollView ponendo una nuova chiamata della funzione ScrollViewEnabled però questa volta con parametro "true".
mainLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ScrollViewEnabled(true); return false; } });Vado a provare, e che accade?
Accade che non funziona più il blocco dello scrolling quando tocco le TextView.
Perché?
Dalla mia esperienza deduco che ciò sia perché il touchListener delle TextView restituisca false, e questo fa sì che l'evento bubbli diffondendosi dalle TextView al loro "parent" che è il mainLayout!
Prima questo bubbling passava inosservato perché non c'era nessun listener associato al mainLayout, ma adesso che c'è un listener che al tocco del mainLayout attiva la ScrollView, si ha che al tocco sulla TextView, dapprima la ScrollView viene bloccata per l'evento onTouch sulla TextView, quindi quando l'evento bubbla si realizza anche l'evento mainLayout.onTouch che invece sblocca la ScrollView.
Per rimediare faccio in modo che l'evento onTouch in comune per le TextView restituisca true anziché false.
View.OnTouchListener onTouchListener=new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ScrollViewEnabled(false);
return true;
}
};
...e funziona perfettamente!
Nessun commento:
Posta un commento