긴 ScrollView 레이아웃으로 스크롤하는 방법은 무엇입니까? 모든 것이 실패했습니다. 내 onCreate 메소드는 다음과 같습니다. protected

내 응용 프로그램의 일부로 사용자에게 이름 목록이 표시되고 적절하다고 생각되면 그룹화하라는 메시지가 표시됩니다.

(ListView 코드는 Android Views 튜토리얼에서 그대로 복사되었습니다. 아직 필요에 맞게 사용자 정의하지 않았 으므로이 작업을 수행하는 방법을 찾으려고합니다.)

기본 레이아웃은 LinearLayout이며 RelativeLayout을 포함하는 ScrollView (아래 코드에서 “groupsScrollView”라고 함)를 포함합니다. 버튼과 텍스트가 있고 그 아래에 ListView가 있는데 이름 목록이 표시됩니다. 이 모든 것이 보이는 화면 영역보다 높기 때문에 사용자는 세로로 스크롤하여 모두 볼 수 있습니다.

페이지가로드 될 때를 제외하고는 페이지 중간에 항상 내 ListView의 상단으로 미리 스크롤되는 것을 제외하고는 모두 아름답게 작동합니다. 내가 만든 텍스트와 버튼은 사용자에게 수행 할 작업을 표시하지 않습니다.

화면을 잡고 위로 스크롤 할 수 있지만 정상적으로 작동하지만 화면을 이미 맨 위로 스크롤하여로드하고 싶습니다. 새로로드 된 페이지의 상단을보기 위해 위로 스크롤 할 필요는 없습니다. 그러나 프로그래밍 방식으로 화면 상단으로 스크롤하려고 시도한 모든 것이 실패했습니다.

내 onCreate 메소드는 다음과 같습니다.

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

“mainScrollView.pageScroll (View.FOCUS_UP); 줄은 문제입니다. 오류가 발생하지 않지만 아무 것도하지 않는 것 같습니다. scrollTo (0,0), scrollDirection (View.FOCUS_UP ), 그리고 내가 생각할 수있는 모든 것.

오류가 발생하지 않기 때문에 이러한 스크롤 명령이 실제로 작동한다고 가정하지만 ScrollView 또는 RelativeLayout을 포함하는 ListView의 상단이 아닌 ListView의 상단으로 스크롤한다고 가정해야합니다. 이것은 구글이 scrollTo (int x, int y) 메소드에 대해 “이 버전은 스크롤을 우리 아이의 경계에 고정시킨다”고 설명한 것으로 보인다.

그래서 더 긴 질문을하기 위해 ScrollView에 포함 된 화면에 많은 뷰를로드 한 다음 프로그래밍 방식으로 전체를 페이지 상단으로 스크롤하여 사용자가 상호 작용할 수 있습니까?

감사!



답변

시험

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

작동해야합니다.


답변

같은 문제, 아마도 일종의 버그가 있었을 것입니다.

fullScroll(ScrollView.FOCUS_UP)다른 답변의 조차도 효과 가 없었습니다.

나를 위해 일한 것은 scroll_view.smoothScrollTo(0,0)대화 상자가 표시된 직후 에 전화 한 것입니다 .


답변

나는 같은 문제가 있었고 이것을 고쳤다. 그것이 당신을 돕기를 바랍니다.

listView.setFocusable(false);


답변

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)이것은 잘 작동하지만이 줄의 문제는 scrollViewObject에서 데이터가 채워질 때 즉시 호출되었다는 것입니다. 데이터가 채워질 때까지 몇 밀리 초 동안 기다려야합니다. 이 코드를 사용해보십시오 :

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

또는

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});


답변

이 모든 유효한 솔루션의 주된 문제점은 화면에 스크롤이 그려지지 않은 경우 스크롤을 위로 올리려고한다는 것입니다.

스크롤보기가 화면에 나타날 때까지 기다렸다가 이러한 솔루션 중 하나를 사용하여 위로 스크롤해야합니다. 지연에 대해 신경 쓰지 않기 때문에 postdelay보다 더 나은 솔루션입니다.

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });


답변

아주 쉽게

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);


답변

View Flipper 또는 Dialog에서 Scrollview를 사용하는 경우 동일한 문제 scrollViewObject.fullScroll(ScrollView.FOCUS_UP)가 발생 scrollViewObject.smoothScrollTo(0, 0)했습니다.

스크롤 초점 상단