即使禁用滑动,TabLayout 上的触摸移动也会继续更改选项卡
Even with swiping disabled, tab continues to be changed with touch movement on TabLayout
我正在开发一个使用 tablayout 并包含 3 个指南的应用程序。第一个用于一般用户信息,第二个指南用于附加信息,最后一个指南用于用户在屏幕上绘图。是第三家有问题的公司,即使禁用滑动,在进行绘图移动时,用户最终还是返回到上一个选项卡。所以,我想知道如何禁用此屏幕上的滑动移动,即使选项卡之间的移动已经通过滑动移动禁用,而不会使绘图无法进行。
需要注意的一点是,当您从下向上或从上到下开始绘制时,即使您稍后要去某个地方,也可以不更改引导线进行绘制。但是,如果你开始画画
我注意到一件事,当我开始从下向上或上下绘制时,我可以在不更改选项卡的情况下绘制,即使我之后去任何地方也是如此。但是,如果我开始在任何地方画画,他就会明白这不是画,而是我想更改标签。我该如何解决这个问题?
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)
}
}
fragment.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...
Drawind 从 bottom/up 或 up/down
开始
Drawind 从 left/right 或 right/left
开始
您应该从 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);
更多信息请查看下方link
如果你还想用ViewPager
那么请看看这个postHow do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?
迁移到 viewPager 的版本 2。为此,请按照以下步骤操作:
- 添加必要的实现:
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" />
- 更新您的适配器:
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
)
}
}
- 您的 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
}
}
- 你的占位符片段:
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)
}
}
}
}
}
- 您的 MainAcitivity:
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()
}
}
这样它会解决你的问题
我正在开发一个使用 tablayout 并包含 3 个指南的应用程序。第一个用于一般用户信息,第二个指南用于附加信息,最后一个指南用于用户在屏幕上绘图。是第三家有问题的公司,即使禁用滑动,在进行绘图移动时,用户最终还是返回到上一个选项卡。所以,我想知道如何禁用此屏幕上的滑动移动,即使选项卡之间的移动已经通过滑动移动禁用,而不会使绘图无法进行。
需要注意的一点是,当您从下向上或从上到下开始绘制时,即使您稍后要去某个地方,也可以不更改引导线进行绘制。但是,如果你开始画画
我注意到一件事,当我开始从下向上或上下绘制时,我可以在不更改选项卡的情况下绘制,即使我之后去任何地方也是如此。但是,如果我开始在任何地方画画,他就会明白这不是画,而是我想更改标签。我该如何解决这个问题?
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)
}
}
fragment.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...
Drawind 从 bottom/up 或 up/down
开始Drawind 从 left/right 或 right/left
开始您应该从 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);
更多信息请查看下方link
如果你还想用ViewPager
那么请看看这个postHow do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?
迁移到 viewPager 的版本 2。为此,请按照以下步骤操作:
- 添加必要的实现:
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" />
- 更新您的适配器:
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
)
}
}
- 您的 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
}
}
- 你的占位符片段:
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)
}
}
}
}
}
- 您的 MainAcitivity:
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()
}
}
这样它会解决你的问题