1

aと aを持つTextView'my のレイアウトに配置されている a s テキストを変更する必要があります。基本的に、現在表示されている の名前を表示するアクション バーをアプリケーションに作成しました。FragmentActivityViewPagerViewPagerAdapterFragment

したがって、これ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;
}  
}

私は何か間違ったことをしていますか?この操作を行う別の方法はありますか?

4

3 に答える 3

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

            }
        });
于 2013-06-05T12:04:54.860 に答える
1

問題を特定することはできませんが、コードを簡素化することをお勧めします。

  1. キャスト内のキャストを避けます。とTabsViewPagerFragmentActivityの両方を使用します。このキャストをパラメーターに割り当て、このパラメーターを使用します。それだけの価値のある処理オーバーヘッド。ifelse
  2. を使用する代わりに、 でローカル パラメータとしてfindViewById保存し、 でメソッドを作成します。また、アクティビティ自体でこの呼び出しをデバッグするのにも役立ちます。R.id.tvTabNameTabsViewPagerFragmentActivitysetTitle(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;
    }

    // use this method in onPageSelected
    public Fragment getFragment(int position) {
        String tag = mFragmentTags.get(position);
        if (tag == null)
            return null;
        return mFragmentManager.findFragmentByTag(tag);
    }

    public FragmentManager getFragmentManager() {
        return mFragmentManager;
    }
}
于 2013-06-05T13:54:34.980 に答える
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.

于 2013-06-26T10:13:47.517 に答える