我需要更改放置在我的TextView'
布局中的FragmentActivity
s文本,该文本具有ViewPager
和ViewPagerAdapter
。基本上我在我的应用程序中创建了一个操作栏,它显示了当前可见的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
}
});
虽然我无法指出问题所在,但我建议您简化代码:
TabsViewPagerFragmentActivity
和if
都使用else
。将此强制转换分配给参数并使用此参数。处理开销值得。findViewById
,将R.id.tvTabName
保存为TabsViewPagerFragmentActivity
中的局部参数,并在setTitle(String title)
中创建方法TabsViewPagerFragmentActivity
。它还可以帮助您在活动本身调试此调用。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
的可见片段改变活动视图的方式。