2014-03-04 42 views
2

我需要檢測用戶從我的某個片段中滑入和滑出的情況,我嘗試了onPause,但是在滑動到相鄰的屏幕時它似乎沒有暫停(在將兩個屏幕移開時它被破壞)。如果可能的話,我想從片段本身做到這一點,因爲我正在動態地改變片段,而且如果某個片段存在,我的一些代碼只會有用。當用戶「瀏覽」viewpager片段時運行代碼?

可以做到這一點嗎?如何檢測「out」(如果可能的話從片段本身)?


編輯:

我使用上這似乎是做到這一點的最好辦法片段setUserVisibleHint試過,但它永遠不會被調用。我使用的API級別19,我不知道缺少了什麼:

import android.app.Fragment; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 


public class Contacts extends Fragment { 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      View view = inflater.inflate(R.layout.fragment_screen_contacts, container, false); 
      return view; 
     } 


    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     Log.d("MyFragment", "This never shows up."); 
     Toast.makeText(getActivity(), "Neither does this", Toast.LENGTH_LONG).show(); 
    } 
} 

回答

5

您可以使用ViewPager#setOnPageChangeListener()這一點。

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 

     ... 

     @Override 
     public void onPageSelected(int position) { 
      // do what you want here, for example 
      if (position != 3) { 
       ... 
      } 
     } 

}); 

編輯:

如果你想邏輯是片段本身裏面,這裏是做到這一點的一種方法:添加一個方法onFragmentExited()或東西到你的子類。把邏輯放在那裏。然後,在OnPageChangeListener中,調用該方法。例如:

viewPager.setOnPageChangeListener(new OnPageChangeListener() { 

    int lastPosition; 
    @Override 
    public void onPageSelected(int position) { 
      MyInterface fragment = (MyInterface)mPagerAdapter.instantiateItem(viewPager, lastPosition); 
      if (fragment != null) { 
       fragment.onFragmentExited(); 
      } 
      /* If you want to notify the fragment being focused 
      fragment = (MiniApp)mPagerAdapter.instantiateItem(viewPager, position); 
      if (fragment != null) { 
       fragment.onFragmentEntered(); 
      } */ 
      lastPosition = position; 
    }      
}); 

adapter.getFragment(position)取決於您用來存儲碎片的適配器/結構。

+0

嗨Makario,在我的viewpager中的片段可以由用戶自定義,所以我想如果可以的話,在片段本身包含代碼。這樣我就不會向Viewpager添加代碼,如果用戶沒有設置特定的片段,那麼這些代碼將毫無用處。讓我知道如果你想出了一個解決方案,或者如果沒有別的出現,我會接受你的答案,在這一點上我試圖setUserVisibleHint沒有運氣(檢查編輯) – lisovaccaro

+0

@ Liso22我更新了你的答案。你可以在你的子類中添加一個方法(如果你有更深的子類,可以覆蓋它)。然後,您可以在需要時調用該方法。 – Makario

+0

非常感謝。我主要使用了你的代碼,儘管我修改了onPageSelected的內部,我添加了Martín推薦的接口。 – lisovaccaro

0

如前所述,並在喜歡的答案測試,你不知道哪個片段已經消失,但是用一點Java,你可以確切地知道哪個片段是新的(以及它在你的適配器中的位置。如果你存儲了「最後一個可見的片段位置」,你可以將它與新的位置並確定哪個是當前最後一個可見的(用戶可以向左或向右滑動!)

Java Secret ...是定義一個接口,使用你的適配器的get ItemAt(pos),在ViewPager上使用一個OnPageChangeListener(),併合並所有三個。也可以讓你的Fragments實現這個界面,這樣你就可以使用ViewPagerAdatper來獲取片段並且例如調用(yourInterface).youHaveBeenHidden();

如果你想知道頁面被掃描的時間,你將不得不使用頁面變化監聽器的onPageScrolled(int position, float positionOffset, int positionOffsetPixels)方法,並在那裏做你的數學(記住,當用戶滾動時,這將被稱爲非常,因爲你得到的像素偏移量,正如你想象的那樣快速增長)。

更新你試過......

public void onHiddenChanged (boolean hidden) 

Added in API level 11 
Called when the hidden state (as returned by isHidden() of the fragment has changed. Fragments start out not hidden; this will be called whenever the fragment changes state from that. 

Parameters 
hidden True if the fragment is now hidden, false if it is not visible. 

更新2這是我要做的事:

public interface ViewPagerFragmentInterface { 
    void onFragmentBecameVisible(); 
} 

我的片段:

public class SomeViewPagerFragment extends Fragment implements ViewPagerFragmentInterface { 
     public void onFragmentBecameVisible() { 
      // I AM VISIBLE! 
     } 
} 

然後在我的ViewPage onPageChangeListener() ...

public void onPageSelected(final int i) { 
ViewPagerFragmentInterface fragment = 
     (ViewPagerFragmentInterface)mPagerAdapter.instantiateItem(mViewPager, i); 
    if (fragment != null) { 
     fragment.onFragmentBecameVisible(); 
    } 
}