簡體   English   中英

添加滾動視圖時,Android 會顯示多個視圖,但僅在刪除滾動視圖並實現自定義滾動時才首先顯示

[英]Android multiple views show when scrollview is added but only first shows if scrollview removed and custom scrolling implemented

我已將片段添加到線性布局中,其中每個子片段視圖都占據整個屏幕。 現在我必須實現滾動功能,以便我可以瀏覽它們。 我試圖添加一個滾動視圖(水平),它顯示了所有的孩子,但由於一些問題,我無法使用滾動視圖。 因此,要滾動,我使用了以下代碼可以很好地滾動但並未顯示所有子項,即使滾動后也只有第一個可見:

/**
     * 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函數,實現了我自己的滾動機制並將我的線性布局放置在這個 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM