1

мне нужно изменить TextView' сек текст, который помещается в расположение моей FragmentActivity, который имеет ViewPager и ViewPagerAdapter. В основном я создал панель действий в своем приложении, которая представляет имя текущего видимого Fragment.Как изменить вид деятельности изнутри фрагментировать ViewPager в:

Поэтому мне нужно, чтобы этот 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()); 

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

Как мне наконец-то удалось справиться с этой проблемой в сочетании с несколькими вещами:

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.

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

У меня уже есть это в моей деятельности, проблема в том, что заголовок/имя вкладки хранится в объекте внутри фрагмента. поэтому мне нужно получить нужный фрагмент, получить из него этот объект, извлечь его имя и применить его к текстовому виду. и к настоящему времени мне это не удалось. –

+0

ОК. с viewPager.getChildAt (index) вы можете получить представление фрагмента. Вы можете добавить скрытый вид (добавить тег с информацией) в фрагмент и получить представление в действии. – mromer

+0

, пожалуйста, просмотрите обновленный вопрос, я был не прав, и метод, который я использовал, вызывает вызов. Я не могу изменить текст TextView из FragmentActivity из фрагмента –

1

Хотя я не могу точно указать проблему, я хотел бы предложить, чтобы упростить вам код:

  1. избегают ввергнуть в гипсе. Вы используете TabsViewPagerFragmentActivity как в if, так и в else. назначьте этот приведение параметру и используйте этот параметр. Накладные расходы на обработку стоят.
  2. вместо findViewById, сохранить R.id.tvTabName в качестве локального параметра в TabsViewPagerFragmentActivity и создать способ setTitle(String title) в TabsViewPagerFragmentActivity. Это также поможет вам отладить этот вызов в самом действии.
  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 (целое положение) { Строка тега = mFragmentTags.get (положение); если (бирка == null) возвращение null; return mFragmentManager.findFragmentByTag (тэг); }

    public FragmentManager getFragmentManager(){ 
        return mFragmentManager; 
    } 
    

    }

+0

около 1: вы правы, я его изменю. 2: У меня есть этот метод в моей TabsActivity, и код достигает этой части, но по какой-то причине он не меняет текст в TextView. 3: У меня уже есть реализация FragmentPagerAdapter, только она реализована по-другому (со списком фрагментов, а не с SparseArray строковых тегов.) Я опубликовал ее реализацию в теле вопроса. –

Смежные вопросы