[Android] 긴 ScrollView 레이아웃의 맨 위로 스크롤하는 방법은 무엇입니까?


Answers

아마도 같은 종류의 버그가 있었을 것입니다.

다른 답변의 fullScroll(ScrollView.FOCUS_UP) 조차도 작동하지 않았습니다.
나를 위해 일한 것은 대화 상자가 표시된 직후에 scroll_view.smoothScrollTo(0,0) 호출하는 것입니다.

Question

내 앱의 일부인 경우 사용자에게 이름 목록이 표시되고 적절하게 그룹화하라는 메시지가 표시됩니다.

참고로, ListView 코드는 안드로이드 뷰 튜토리얼에서 축 어적으로 복사되었으며, 아직 사용자의 필요에 맞게 사용자 정의하지 않았습니다.이 작업을 수행하는 방법을 파악하려고합니다.

기본 레이아웃은 RelativeLayout을 포함하는 ScrollView (아래 코드에서 "groupsScrollView"라고 함)를 포함하는 LinearLayout입니다. 몇 가지 버튼과 텍스트가 있고 그 아래에있는 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의 맨 위로 스크롤하고 있다고 가정해야합니다. 이것은 scrollTo (int x, int y) 메소드에 대한 Google의 설명에 의해 확인됩니다. "이 버전은 우리 아이의 경계까지 스크롤을 고정합니다."라고 말합니다.

긴 질문을 더 길게하려면 ScrollView에 포함 된 화면에서 많은 뷰를로드 한 다음 프로그래밍 방식으로 페이지 위쪽으로 스크롤하여 사용자가 프로그램과 상호 작용할 수있게하려면 어떻게해야합니까?

감사!




 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 



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().removeOnGlobalLayoutListene‌​r(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});



나는 같은 문제에 직면했다. View Flipper 또는 Dialog 내부에서 Scrollview를 사용할 때 scrollViewObject.fullScroll(ScrollView.FOCUS_UP) 이 false를 반환하므로 scrollViewObject.smoothScrollTo(0, 0) 이 나를 위해 일했다.

스크롤 포커스 탑




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



scrollview의 강제 스크롤입니다.

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });



Links