1. 程式人生 > >fragment+scrollview 切換fragment自動滾動到頂部

fragment+scrollview 切換fragment自動滾動到頂部

專案中一個MainActivity 裝載了四個Fragment 其中最後一個fragment中包含了一個ScrollView ,ScrollView中還包含了一個GridView(fragment的交替顯示用的是隱藏/顯示,而不是ViewPager裝載fragment,要注意這一點哦)

我的目標是:1: fragment間來回切換時ScrollView自動滑到頂部

                     2: 從包含ScrollView的Fragment中跳轉至其他Activity後,返回這個Fragment,fragemt依然自動滑到頂部

                     3: 即使手動將ScrollView滑動至中間部分,以上兩條依然成立

解決方案:1,程式碼中:

設定ScrollView獲取焦點:

scrollView.setFocusable(true);
scrollView.setFocusableInTouchMode(true);
ScrollView.requestFocus();

設定我的ScrollView中的GridView不獲取焦點:

gridView.setFocusable(false);

設定ScrollView滑到頂部:

scrollView.fullScroll(ScrollView.FOCUS_UP);//這個是設定ScrollView滑動到頂部的一種方案
scrollView.scrollTo(0,0);//這是scrollView滑動到頂部的第二種方案
//這兩種的區別就是當用戶切換到包含ScrollView的fragment的時候
//第一種:ScrollView有一個滑動到頂部的動作(一個動畫);
//第二種:看不到滑動的動作,直接看到的就是頂部

                    2,佈局中:ScrollView的佈局

android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"

                    為什麼要在佈局和程式碼中兩次設定呢。雙重保險嘛~~只在佈局或者只在程式碼中設定有時就會有問題。。為什麼我也不太懂(求大神指點)

經過這兩方面的設定,依然不能每次都實現所有目標,從其他fragment切換回來還是不能自動置頂(好,重點來啦!!敲黑板兒!!)

思路: 1.fragmennt的生命週期;專案中並不是使用ViewPager裝載Fragment,只是在底部畫了四個佈局,點選切換Fragment,我在包含ScrollView的fragment裡面將Fragment的生命週期全都打印出來,發現並沒有走,最後還是問了別人,知道了一個fragment的方法

@Override
    public void onHiddenChanged(boolean hidd) {
     if(!hidd){//當fragment從隱藏到出現的時候
       scrollView.scrollTo(0,0);
   }
}

//從Activity回到包含ScrollView的fragment
//fragment的生命週期,我在重寫了onResume() 
<pre name="code" class="java"> @Override
    public void onResume() {
        super.onResume();
        myScrollView.scrollTo(0,0);//從其他Activity回來,讓ScrollView置頂
    }

就這樣,把程式碼中,佈局中,fragment的生命週期中(就是以上我寫的所有的程式碼)設定完畢,就完美啦~~沒瑕疵!!!

小菜鳥學習ing...加油↖(^ω^)↗~