2010-02-09 17 views
14

Nella mia applicazione ho una linea per aumentare la larghezza di un widget (trascinando la linea a destra/sinistra) e ho il ScrollView abilitato nella stessa attività. Devo disabilitare l'azione di visualizzazione a scorrimento quando l'utente tocca la linea e quando l'utente lo rilascia deve essere abilitato. Lo ScrollView dovrebbe essere nello stato visibile ma l'azione della vista di scorrimento dovrebbe essere disabilitata. Per favore aiutami a risolvere questo problema. Ho provato con questi, ma nessuno di loro sta funzionando.Disabilita azione ScrollView

scroll.setEnabled(false); 
scroll.setFocusable(false); 
scroll.setHorizontalScrollBarEnabled(false); 
scroll.setVerticalScrollBarEnabled(false); 

Grazie in anticipo.

risposta

5

Non sicuro che questo sia quello che stai chiedendo, ma potresti dover creare sottoclassi ScollView e renderti proprietario dell'implementazione che può disabilitare lo scorrimento in determinati momenti.

Ecco qualcuno che ha fatto qualcosa di simile, ma per gli eventi di tocco, per disabilitare lo scorrimento di quelli.

http://osdir.com/ml/AndroidDevelopers/2009-08/msg01099.html

46

Questo potrebbe essere un po 'tardi, ma ho incontrato lo stesso problema così la mia soluzione è simile al precedente, ha dovuto disattivare l'OnTouchListener come segue:

// Get the ScrollView 
final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview); 


// Disable Scrolling by setting up an OnTouchListener to do nothing 
myScroll.setOnTouchListener(new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return true; 
    } 
}); 


// Enable Scrolling by removing the OnTouchListner 
tvDisplayScroll.setOnTouchListener(null);  
36

Questo è un po' tardi , ma un modo ancora più semplice è quello di ottenere i tuoi genitori ViewGroup e chiamare requestDisallowInterceptTouchEvent(true) su di esso. Ciò causa non solo il genitore immediato (scroll view) ma qualsiasi altro oggetto genitore che potrebbe intercettare il tocco per ignorarlo per la durata dell'evento particolare. Questo è ottimo quando hai un figlio trascinabile e un genitore trascinabile, e vuoi disabilitare il trascinamento del genitore mentre il bambino viene trascinato.

È anche una soluzione più generale rispetto alla disabilitazione specifica della visualizzazione di scorrimento. Se riutilizzi la tua vista secondaria trascinabile da qualche altra parte, funzionerà ancora: non è necessario conoscere l'ID della vista di scorrimento. Il codice che è riutilizzabile senza modifiche è sempre buono.

+1

Questo è perfetto, grazie! – Jason

+1

Brillante. Puoi usarlo nelle viste facendo 'getParent(). RequestDisallowInterceptTouchEvent (...)'. L'ho usato in una galleria a scorrimento orizzontale all'interno di un ScrollView e funziona perfettamente! – Timmmm

+3

Stranamente ho avuto una scrollview-> layout lineare-> il mio nuovo controllo e ho scoperto che dovevo effettivamente selezionare la scrollview per chiamare questa richiestaDisallowInterceptTouchEvent (true) prima che avesse l'effetto di fermare lo scrolling. Penso che i documenti dicono che invierà questo messaggio a tutti i genitori, ma questo non ha funzionato per me. – sradforth

0

Se qualcuno sta usando L Android o versione successiva e prioritario onTouch e onInterceptTouchEvent non funziona:
provare ignorando onStartNestedScroll e return false.

C'è anche attribuire un nuovo XML nestedScrollingEnabled, ma sembra che deve essere sul View che perde l'evento di scorrimento, piuttosto che sulla ScrollView essere colpiti dalla fuga, o in qualsiasi parte della gerarchia di layout fra loro. Quindi, se non sai in anticipo quale diavolo ScrollView possiedi, ignorare onStartNestedScroll per il ScrollView interessato è la strada da percorrere.

Problemi correlati