Eu tenho o ViewPager e abaixo dele tenho 10 botões. Ao clicar no botão, por exemplo # 4, o pager vai imediatamente para a página # 4 por mPager.setCurrentItem(3);
. Mas, eu quero desativar a paginação passando o dedo na horizontal. Assim, a paginação é feita SOMENTE clicando nos botões. Então, como posso desativar a passagem com o dedo?
android
android-viewpager
teatral
fonte
fonte
Respostas:
Você precisa subclassificar
ViewPager
.onTouchEvent
possui muitas coisas boas que você não deseja alterar, como permitir que as visualizações de crianças sejam tocadas.onInterceptTouchEvent
é o que você quer mudar. Se você procurar o códigoViewPager
, verá o comentário:Aqui está uma solução completa:
Primeiro, adicione esta classe à sua
src
pasta:Em seguida, certifique-se de usar essa classe em vez da regular
ViewPager
, que você provavelmente especificou comoandroid.support.v4.view.ViewPager
. No seu arquivo de layout, você deve especificá-lo com algo como:Este exemplo em particular está em um
LinearLayout
e pretende ocupar a tela inteira, e é por isso quelayout_weight
é 1 elayout_height
é 0dp.E o
setMyScroller();
método é para uma transição suavefonte
0dp
altura /1
peso sobre amatch_parent
altura para obter o efeito de tela cheia? Você obtém melhorias de desempenho fazendo isso?executeKeyEvent()
. Este é o método que então chamaallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
A extensão mais geral
ViewPager
seria criar umSetPagingEnabled
método para que possamos ativar e desativar a paginação em tempo real. Para ativar / desativar a passagem, basta substituir dois métodos:onTouchEvent
eonInterceptTouchEvent
. Ambos retornarão "false" se a paginação foi desativada.Em seguida, selecione isso em vez do viewpager interno em XML
Você só precisa chamar o
setPagingEnabled
métodofalse
e os usuários não poderão deslizar para paginar.fonte
onTouchEvent
eonInterceptTouchEvent
métodos comreturn enabled && super.onTouchEvent(event);
A maneira mais simples é
setOnTouchListener
e retornotrue
paraViewPager
.fonte
pager.setCurrentItem(pager.getCurrentItem());
antes de retornartrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
no meu adaptador, o que força a recriação de páginas e talvez a solução de outros problemas também.Melhor declará-lo estiloso, para que você possa alterar sua propriedade de xml:
E em seus valores / attr.xml:
para que você possa usá-lo em seu layout xml:
Obviamente, você ainda pode ter uma propriedade get / set.
fonte
Substituindo apenas
onTouchEvent
eonInterceptTouchEvent
não é suficiente caso você tenha o ViewPager em outro ViewPager. O Child ViewPager roubaria os eventos de toque de rolagem horizontal do ViewPager pai, a menos que esteja posicionado na primeira / última página.Para fazer essa configuração funcionar corretamente, você também precisa substituir o
canScrollHorizontally
método.Veja a
LockableViewPager
implementação abaixo.fonte
Agora não precisamos criar customizações
ViewPager
Um novo
ViewPager2
nome Ver disponível no androidViewPager2
suporta paginação vertical, além da paginação horizontal tradicional. Você pode ativar a paginação vertical para umViewPager2
elemento configurando seuandroid:orientation
atributoPara desativar a passagem em
viewpager2
usoPara habilitar o
viewpager2
uso em Usarpara mais informações, verifique isto
ATUALIZAR
Verifique: Migrar do ViewPager para o ViewPager2
Para obter um exemplo completo, verifique este Uso do ViewPager2 no Android
fonte
viewpager2
com #RecyclerView.Adapter
Se você estiver estendendo do ViewPager, também deverá substituir
executeKeyEvent
como indicado anteriormente por @araksComo alguns dispositivos como o Galaxy Tab 4 10 'mostram esses botões onde a maioria dos dispositivos nunca os mostra:
fonte
Para desativar o furto
Para ativar o furto
fonte
Eu precisava desativar o deslize em uma página específica e dar uma ótima animação com elástico, eis como:
fonte
onPageSelected
será executado. Até a próxima página mudará. Portanto, esse código não é necessário.Eu sei que é muito tarde para postar isso, mas aqui está um pequeno truque para alcançar seu resultado;)
Basta adicionar uma visualização simulada abaixo do seu viewpager:
Em seguida, adicione um
OnClickListener
ao seuRelativeLayout
.Seja um pouco criativo com layouts, canais e comportamento e aprenderá a encontrar uma maneira de fazer absolutamente tudo o que imaginar :)
Boa sorte!
fonte
setClickable
vez desetOnClickListener
, se você não precisar manipularonClick
eventos.Eu escrevi um
CustomViewPager
com um controle swiping:Se você definir
canScroll
atrue
, esteViewPager
pode ser passando com o dedo,false
pelo contrário.Eu uso isso no meu projeto e funciona muito bem até agora.
fonte
Eu usei essa aula com sucesso. É necessário substituir o executeKeyEvent para evitar o uso de setas em alguns dispositivos ou para acessibilidade:
E no xml chame assim:
fonte
performClick()
método não é substituído.Em Kotlin, minha solução, combinando as respostas acima.
fonte
onInterceptTouchEvent()
impedirá que as visualizações secundárias recebam entrada. Na maioria dos casos, esse não é o comportamento pretendido.No kotlin, podemos resolver isso criando um widget personalizado que herda a classe ViewPager e adicionando um valor de sinalizador para controlar o comportamento do furto.
NoSwipePager.kt
Em xml
Desative a passagem programada. Se o
kotlin-android-extensions
plug-in for aplicado no build.gradle , a passagem pode ser desativada escrevendo o código abaixo.Caso contrário, podemos desativar a passagem usando o código abaixo:
fonte
onInterceptTouchEvent()
impedirá que as visualizações secundárias recebam entrada. Na maioria dos casos, esse não é o comportamento pretendido.super.onInterceptTouchEvent(event)
resultados nessas visualizações não recebe nenhuma entrada (que é o objetivo documentado doonInterceptTouchEvent
método).onInterceptTouchEvent()
método de substituição impede que ele (conteúdo) receba entrada.Tente substituir e retornar true de onInterceptTouchEvent () e / ou onTouchEvent () , que consumirá eventos de toque no pager.
fonte
true
para sugerir que o evento de toque foi tratado?Outra solução fácil para desativar o swiping em uma página específica (neste exemplo, página 2):
fonte
fonte
Se você escrever uma galeria de imagens com
ImageView
s eViewPager
compatível com zoom e pan, consulte uma solução simples descrita aqui: Implementando um ImageView com zoom estendendo o ViewPager padrão no Phimpme Android (e amostra do Github - PhotoView ). Esta solução não funcionaViewPager
sozinha.fonte
Se você estiver usando o ViewPager2, basta usar:
viewpager.setUserInputEnabled(false);
Dos documentos :
Obrigado a: https://stackoverflow.com/a/61685871/9026710
fonte
Se você deseja implementar o mesmo para Android no Xamarin, aqui está uma tradução para C #
Eu escolhi o nome do atributo " ScrollEnabled ". Porque o iOS usa exatamente o mesmo nome. Portanto, você tem nomes iguais nas duas plataformas, facilitando para os desenvolvedores.
No arquivo .axml:
fonte
Nenhum do código acima está funcionando corretamente. Tentei isso
fonte
aqui está minha implementação
se você deseja desativar a animação de furto, pode usar o swipeListener para a esquerda e para a direita e ainda deseja rolar o dedo, mas sem animação
Viewpager
Método 1-OverrideonInterceptTouchEvent
eonTouchEvent
2- crie o seu próprio
GestureDetector
3- detectar o gesto de furto e usar o
setCurrentItem(item, false)
ViewPager
Quando você estiver configurando o ViewPager, defina o swipeListener
fonte
Acabei de personalizar um pouco o viewpager e desabilito o swiping facilmente.
fonte
fonte