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)。我将它的实现发布在问题主体中。 –

相关问题