Даже при отключенном смахивании вкладка по-прежнему изменяется с перемещением касания на TabLayout - PullRequest
2 голосов
/ 19 июня 2020

Я разрабатываю приложение, которое использует раскладку вкладок и содержит 3 руководства. Первое предназначено для общей информации пользователя, второе руководство - для дополнительной информации, а последнее руководство предназначено для рисования на экране пользователем. это третья компания, у которой есть проблемы даже с отключенным смахиванием, когда при рисовании движений пользователь возвращается на предыдущую вкладку. Итак, я хотел бы знать, как отключить движение свайпа на этом экране, даже при перемещении между вкладками оно уже отключено с помощью скользящего движения, не делая невозможным рисование.

Следует отметить, что когда вы начинаете рисовать снизу вверх или вверх и вниз, вы можете рисовать, не меняя направления, даже если вы собираетесь куда-то позже. Однако, если вы начнете рисовать

Я заметил одну вещь: когда я начинаю рисовать снизу вверх или вверх и вниз, я могу рисовать, не меняя вкладки, даже если я go где-нибудь потом. Однако, если я где-нибудь начинаю рисовать, он понимает, что это не рисунок, а что я хочу поменять вкладки. Как это исправить?

class Main2Activity : AppCompatActivity() {

@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    val sectionsPagerAdapter = SectionsPagerAdapter(this, supportFragmentManager)
    val viewPager: ViewPager = findViewById(R.id.viewPager)
    viewPager.adapter = sectionsPagerAdapter
    viewPager.setOnTouchListener { _, _ -> return@setOnTouchListener true }
    val tabs: TabLayout = findViewById(R.id.tabs)
    tabs.setupWithViewPager(viewPager)

   }
}

фрагмент. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ufrn.dissertation.activities.Main2Activity">

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minHeight="?actionBarSize"
        android:padding="@dimen/appbar_padding"
        android:text="@string/app_name"
        android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" />

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary" />
  </com.google.android.material.appbar.AppBarLayout>

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Фрагмент изображения

class ImagesFragment : Fragment() {
override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_imagens, container, false)
 ...CODE DRAWING...

Отрисовка снизу / вверх или вверх / вниз

image

Отрисовка, начиная слева / справа или справа / слева

image

Ответы [ 2 ]

1 голос
/ 23 июня 2020

Перейти на версию 2 viewPager. Для этого выполните следующие действия:

- Добавьте необходимые реализации:

implementation 'com.google.android.material:material:1.3.0-alpha01'
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'

- обновите макет:

  <androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_anchorGravity="bottom"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

- Обновите адаптер yout:

class SectionsPagerAdapter(
private val activity: FragmentActivity
) : FragmentStateAdapter(activity) {

override fun createFragment(position: Int): Fragment {
    return when (position) {
        0 -> ProfileFragment()
        1 -> TreatmentFragment()
        else -> ImagesFragment()
    }
}

fun getPageTitle(position: Int): CharSequence =
    activity.resources.getString(TAB_TITLES[position])

override fun getItemCount(): Int = TAB_TITLES.size

companion object {
    private val TAB_TITLES = arrayOf(
        R.string.tab_text_1,
        R.string.tab_text_2,
        R.string.tab_text_3
    )
}
}

- Your PageViewModel:

class PageViewModel : ViewModel() {

private val _index = MutableLiveData<Int>()
val text: LiveData<String> = Transformations.map(_index) {
    "Hello world from section: $it"
}

fun setIndex(index: Int) {
    _index.value = index
}
}

- Ваш PlaceholderFragment:

class PlaceholderFragment : Fragment() {

private lateinit var pageViewModel: PageViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    pageViewModel = ViewModelProviders.of(this).get(PageViewModel::class.java).apply {
        setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.fragment_main2, container, false)
    val textView: TextView = root.findViewById(R.id.section_label)
    pageViewModel.text.observe(viewLifecycleOwner, Observer {
        textView.text = it
    })
    return root
}

companion object {

    private const val ARG_SECTION_NUMBER = "section_number"

    @JvmStatic
    fun newInstance(sectionNumber: Int): PlaceholderFragment {
        return PlaceholderFragment().apply {
            arguments = Bundle().apply {
                putInt(ARG_SECTION_NUMBER, sectionNumber)
            }
        }
    }
}
}

- И ваша MainActivity:

class MainActivity : AppCompatActivity() {


@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    val sectionsPagerAdapter = SectionsPagerAdapter(this)
    val viewPager = findViewById<ViewPager2>(R.id.viewPager).apply {
        adapter = sectionsPagerAdapter
        isUserInputEnabled = false
    }
    val tabs: TabLayout = findViewById(R.id.tabs)
    TabLayoutMediator(tabs, viewPager, true) { tab, position ->
        tab.text = sectionsPagerAdapter.getPageTitle(position)
    }.attach()

}
}

Таким образом вы решите вашу проблему

1 голос
/ 23 июня 2020

Вам следует перейти с ViewPager на ViewPager2

Вы должны использовать

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        app:layout_anchor="@id/tabs"
        app:layout_anchorGravity="bottom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
/>

вместо

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

Существуют встроенные методы для отключения пролистывания ViewPager2

Для отключения пролистывания в ViewPager2

myViewPager2.setUserInputEnabled(false);

Для включения пролистывания в ViewPager2

myViewPager2.setUserInputEnabled(true);

Подробнее информацию, пожалуйста, проверьте ссылку ниже

, если вы все еще хотите использовать ViewPager, прочтите этот пост Как отключить перелистывание страниц с помощью палец в ViewPager, но по-прежнему иметь возможность проводить пальцем программно?

...