[英]How to change View of the Activity from within the ViewPager's Fragment?
我需要更改TextView'
的文本,該文本放置在具有ViewPager
和ViewPagerAdapter
FragmentActivity
的布局中。 基本上我在我的應用程序中創建了一個操作欄,它顯示了當前可見Fragment
的名稱。
所以,我需要此TextView
對在所述可見片段的每個改變來改變ViewPager
(或者與滑動運動或使用所選擇的TabHost
)。 從我的搜索中我發現這種方法可以幫助我實現我的目標:
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
Log.d(TAG, "setUserVisibleHint invoked!");
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
if (odTab != null && getActivity() != null)
{
Log.d(TAG, "Currently visable tab: "+odTab.getTabTitle());
Toast.makeText(getActivity(), "Currently visable tab: "+odTab.getTabTitle(), Toast.LENGTH_LONG).show();
if (application.getCurrentDataSource() == DataSource.SSRS)
{
if (rsTab.getTabTitle().equals("") || rsTab.getTabTitle() == null)
{
tabName.setVisibility(View.GONE);
}
else
{
tabName.setText(rsTab.getTabTitle());
}
}
else if (application.getCurrentDataSource() == DataSource.SGRDL)
{
Log.d(TAG, "found Title textView from fragmentActivity");
if (odTab.getTabTitle().equals("") || odTab.getTabTitle() == null)
{
((TabsViewPagerFragmentActivity)getActivity()).findViewById(R.id.tvTabName).setVisibility(View.GONE);
}
else
{
Log.d(TAG, "set Title textView to: "+odTab.getTabTitle());
((TextView) ((TabsViewPagerFragmentActivity)getActivity()).findViewById(R.id.tvTabName)).setText(odTab.getTabTitle());
}
}
}
}
}
我試圖在我的片段中實現它但由於某種原因這一行:
((TextView) ((TabsViewPagerFragmentActivity)getActivity()).findViewById(R.id.tvTabName)).setText(odTab.getTabTitle());
盡管在viewPager中每個片段更改都會在日志中顯示此行,但它不執行任何操作:
Log.d(TAG, "set Title textView to: "+odTab.getTabTitle());
更新:我的適配器:
public class ViewPagerAdapter extends FragmentPagerAdapter
{
private List<Fragment> fragments;
/**
* @param fm
* @param fragments
*/
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
難道我做錯了什么? 還有另一種方法可以做這個操作嗎?
在您的活動中,您可以:
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
// Change your textview
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
雖然我無法指出問題所在,但我建議您簡化代碼:
if
和else
使用TabsViewPagerFragmentActivity
。 將此強制轉換分配給參數並使用此參數。 處理開銷值得。 findViewById
,保存R.id.tvTabName
如在本地參數TabsViewPagerFragmentActivity
並創建一個方法setTitle(String title)
在TabsViewPagerFragmentActivity
。 它還可以幫助您在活動本身調試此調用。 我同意@mromer - 嘗試從活動中訪問該片段。 要實現此目的,請使FragmentPagerAdapter
繼承以下類:
public abstract class SmartFragmentPagerAdapter extends FragmentPagerAdapter{ private SparseArray<String> mFragmentTags; private FragmentManager mFragmentManager; public SmartFragmentPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); mFragmentManager = fragmentManager; mFragmentTags = new SparseArray<String>(); } @Override public Object instantiateItem(ViewGroup container, int position) { Object obj = super.instantiateItem(container, position); if (obj instanceof Fragment) { // record the fragment tag here. Fragment f = (Fragment) obj; String tag = f.getTag(); mFragmentTags.put(position, tag); } return obj; }
//在onPageSelected上使用此方法public Fragment getFragment(int position){String tag = mFragmentTags.get(position); if(tag == null)返回null; return mFragmentManager.findFragmentByTag(tag); }
public FragmentManager getFragmentManager(){ return mFragmentManager; }
}
我最終設法處理這個問題的方式與以下幾點相結合:
1.首先我在片段中聲明了一個接口:
public interface OnFragmetVisibleListener{
public void fragmetVisible(boolean visible);
}
2.接下來我將這個函數添加到片段中以了解它何時附加到ViewPager
:
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
try{
onFragmetVisibleListener = (OnFragmetVisibleListener) activity;
isAttached = true; //flag for whether this framgnet is attache to pager
} catch (ClassCastException e){
throw new ClassCastException(activity.toString() + " must implement interface OnFragmetVisibleListener");
}
}
3.我還添加了以下方法以了解片段何時可見並在Application
類中設置它的數據對象:
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
Log.d(TAG, "setUserVisibleHint invoked!");
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
if (odTab != null && getActivity() != null)
{
Log.d(TAG, "Currently visable tab: "+odTab.getTabTitle());
application.currentVisibleTab = odTab;
}
if (isAttached)
{
onFragmetVisibleListener.fragmetVisible(true);
}
}
}
4.在我的ViewPager
活動中,我讓它在第1步中實現定義的接口:
public class TabsViewPagerFragmentActivity extends FragmentActivity implements GridFragment.OnFragmetVisibleListenerr
5.接下來我添加了未實現的方法:
@Override
public void fragmetVisible(boolean visible)
{
if(visible)
{
setCurrentTabTitle(application.currentVisibleTab.getTabTitle());
}
}
6.當setCurrentTabTitle
為:
public void setCurrentTabTitle(String title)
{
tvTabTitle.setText(title); //my TextView that's needs to be changed.
Log.d(TAG, "set tab title from activity: "+title);
}
就是這樣,這就是我根據ViewPager
的可見片段更改活動視圖的ViewPager
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.