问题描述
我已将片段添加到线性布局中,其中每个子片段视图都占据完整的屏幕。现在,我必须实现滚动功能,以便可以浏览它们。我试图添加一个scrollView(水平),它显示了所有的孩子,但由于某些问题,我无法使用scrollview。因此,要滚动,我使用了以下代码,该代码可以很好地滚动,但并未显示所有子项,即使滚动后也只有第一个可见:
/**
* A function to scroll towards the left.
*/
public void scrollLeft(){
LinearLayout layout = findViewById(R.id.viewList);
int x = getResources().getdisplayMetrics().widthPixels;
layout.scrollBy(-x,0); // scroll by the amount of the screen's width
}
/**
* A function to scroll towards the right.
*/
public void scrollRight(){
LinearLayout layout = findViewById(R.id.viewList);
int x = getResources().getdisplayMetrics().widthPixels;
layout.scrollBy(x,0); // scroll by the amount of the screen's width
}
我什至尝试滚动ConstraintLayout(基本布局),但结果也相同。 这是我的activity_test.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/TestRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestActivity">
<LinearLayout
android:id="@+id/viewList"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
这是我用来将片段添加到LinearLayout的代码,仅在onCreate方法中调用此代码:
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
for (int i = 0; i < results.length; i++) {
ResultFragment result = new ResultFragment();
// configuring the fragment
// ....
LinearLayout l = new LinearLayout(this);
l.setId(View.generateViewId());
transaction.add(l.getId(),result,"result-"+i);
((LinearLayout)findViewById(R.id.viewList)).addView(l,i);
findViewById(R.id.viewList).invalidate();
}
transaction.commit();
解决方法
没有任何反应,但没有问题,我自己找到了解决方案。
所以我所做的很简单。我创建了一个自定义ScrollView,它重写了onTouchEvent
函数,实现了自己的滚动机制,并将我的linearlayout放置在此scrollView和kaboom中!有效。新的ScrollView如下所示:
package com.nalin.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
public class LockedHScrollView extends HorizontalScrollView {
/** The variables used to detect left-right swipes*/
float x1,x2;
/** variable to check whether the swipes made were valid (distance was large enough) */
final float distance = 200;
public LockedHScrollView(Context context){super(context);}
public LockedHScrollView(Context context,AttributeSet attrs){super(context,attrs);}
public LockedHScrollView(Context context,AttributeSet attrs,int defStyleAttr){super(context,attrs,defStyleAttr);}
/**
* A function to scroll towards the left.
*/
public void scrollLeft(){
int x = getResources().getDisplayMetrics().widthPixels;
scrollBy(-x,0); // scroll by the amount of the screen's width
}
/**
* A function to scroll towards the right.
*/
public void scrollRight(){
int x = getResources().getDisplayMetrics().widthPixels;
scrollBy(x,0); // scroll by the amount of the screen's width
}
/**
* A function to check swipes for scrolling between multiple result fragments.
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
x1 = event.getX();
}else if (event.getAction() == MotionEvent.ACTION_UP){
x2 = event.getX();
if ((x2-x1)>0){ //Right swipe
if (x2-x1 >= distance){ // Validate that the swipe was long enough
scrollLeft();
}
}else if((x1-x2)>0){ // Left swipe
if ((x1-x2)>=distance){ // Validate that the swipe was long enough
scrollRight();
}
}
}
return true;
}
}