1

我需要更改被放置在我FragmentActivity的佈局具有ViewPagerViewPagerAdapter一個TextView' s的文字。基本上我在我的應用程序中創建了一個操作欄,顯示當前可見的名稱Fragment如何更改活動的查看從ViewPager的片段中:

因此,我需要這個TextViewViewPager中的可見片段的每次更改(使用滑動動作或使用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()); 

UPDATE: 我的適配器:

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; 
} 
} 

我做錯了什麼?有沒有另一種方法來做這個操作?

任何幫助,將不勝感激。

在此先感謝。

回答

0

的辦法,我終於成功地處理這個問題是結合了幾件事情:

首先我在片段中聲明的接口:

public interface OnFragmetVisibleListener{ 
    public void fragmetVisible(boolean visible); 
} 

接着添加此功能,以及該片段知道當它附着到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的可見片段。

3

在你的活動,你可以這樣做:

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 

      } 
     }); 
+0

我已經在我的活動中有這個問題,問題是標籤標題/名稱存儲在片段內的對象中。所以我需要得到正確的片段,從中獲取該對象,提取它的名稱並將其應用於textview。到現在我還沒有設法做到這一點。 –

+0

好的。用viewPager.getChildAt(index)你可以得到片段視圖。您可以在片段中添加隱藏視圖(在您的信息中添加標籤)並獲取活動視圖。 – mromer

+0

請看更新的問題,我錯了,我用的方法得到調用我只能不能從片段 –

1

雖然我不能針點的問題,我建議你簡化代碼:

  1. 避免投中投。您在ifelse中都使用TabsViewPagerFragmentActivity。將此轉換分配給參數並使用此參數。處理開銷值得。
  2. 而不是使用findViewById,保存R.id.tvTabName作爲TabsViewPagerFragmentActivity中的本地參數,並在TabsViewPagerFragmentActivity中創建方法setTitle(String title)。它還可以幫助您在活動本身調試此調用。
  3. 我同意@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 公共片段getFragment(INT位置){ 字符串變量= mFragmentTags.get(位置); if(tag == null) return null; 返回mFragmentManager。findFragmentByTag(標籤); }

    public FragmentManager getFragmentManager(){ 
        return mFragmentManager; 
    } 
    

    }

+0

約1中改變FragmentActivity的TextView的文本:你是對的,我會改變它。 2:我在TabsActivity中有這個方法,代碼到達了這個部分,但由於某種原因,它不會改變TextView中的文本。 3:我已經有了一個FragmentPagerAdapter的實現,只是它以不同的方式實現(使用片段列表而不是字符串標籤的SparseArray)。我將它的實現發佈在問題主體中。 –

相關問題