Java 如何基于ViewPager中的当前ImageView更新parant活动中的TextView

Java 如何基于ViewPager中的当前ImageView更新parant活动中的TextView,java,android,android-fragments,Java,Android,Android Fragments,我是安卓开发者的新手,我现在正为这个烦人的问题挣扎了好几天。 我试过谷歌和很多文章。没人帮忙。还尝试了IRC的一些在线帮助,但无法得到一个直接的答案。也许你能指引我正确的方向 我的应用程序基本上是一个包含单个片段类的ViewPager。在Fragment类中,有一个switch case块,它根据位置确定要从resources文件夹加载的图像。问题是,我的父活动中有一个TextView视图,需要根据当前图片进行更新。像一个图像标题。 我用过: 在onCreateView()中,从片段中访问该Te

我是安卓开发者的新手,我现在正为这个烦人的问题挣扎了好几天。 我试过谷歌和很多文章。没人帮忙。还尝试了IRC的一些在线帮助,但无法得到一个直接的答案。也许你能指引我正确的方向

我的应用程序基本上是一个包含单个片段类的ViewPager。在Fragment类中,有一个switch case块,它根据位置确定要从resources文件夹加载的图像。问题是,我的父活动中有一个TextView视图,需要根据当前图片进行更新。像一个图像标题。 我用过:

在onCreateView()中,从片段中访问该TextView。并增加了一个:

tv.setText("Picture 1");
例如,连接到开关盒块。这样,当显示图片时,文本视图就会更新。 问题是,在父活动中的每个幻灯片(getItem(int position))中检索新片段的方法会被调用两次,以将多个片段加载到内存中。这将导致当前位置提前一整。也就是说,例如,switch case位于case 0上,它显示一个特定的图片,但是文本从case 1更新。 正因为如此,我无法让它正常工作。 我做错了什么


谢谢你

好的,我会给你一段代码,你可以使用它,不仅仅是
字符串
,而是你想从片段发送到活动的任何数据,甚至是从彼此之间的其他类型的类

这就是“setOnSomethingHappenListener(listener);”上也使用的代码类型

然后在你的活动中,你将

public class MyActivity extends Activity implements TitleChangeListener{

    @Override
    onTitleChanged(String title){
          // set here your value
    }

}
然后在你的碎片上

public void MyFragment extends Fragment{

    private TitleChangeListener listener;

    @Override
    public void onAttach(Activity activity){
        if(activity instanceof TitleChangeListener)
            listener = (TitleChangeListener)activity;
        else
            // throw some error ???
    }

    @Override
    public void onResume(){
        listener.onTitleChanged("my title");
    }

}
还记得我把这些都背下来了,肯定会有一些小错误。
但是只要遵循这个想法,你就会没事。

如果你能够根据当前片段位置确定文本,那么只有你才能使用。在活动中,通过调用
mviewpage.setOnPageChangeListener(SomeOnPageChangeListener)
实现该接口并使用它。使用
OnPageChangeListener.onPageSelected()
方法确定放入
TextView
的文本

不幸的是,SDK中存在错误,并且在第一次显示位置0处的页面时,不会调用onPageSelected()。您可以在上面的链接下找到解决方法,使用
ViewPager.setCurrentPage(1)
或仅在
onCreate()
方法中手动设置该位置的文本

示例代码:

//activity onCreate()
protected void onCreate(Bundle savedInstanceState) {
    ...
    mTextView = (TextView) findViewById(R.id.text_view);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
                String someText = determineText(position)
                mTextView.setText(someText);

    });

    //because onPageSelected will not be called for page 0 first time
    String someText = determineText(0)
    mTextView.setText(someText);
}

private String determineText(int position){ //static?
    //switch?
}

就因为你提到了它是Android中的一个新标题,你可能会对检查PagerTitleStrip()感兴趣哦!这很有趣。我来看看。非常感谢。这是接近我需要的,但不完全是。我设法实现了它,但是我得到了一个静态文本,所以我尝试了PagerTabStrip。用于动态更新。但这仍然不是我所需要的。我想在某个特定位置更新某个文本视图…好的。所以我尽我所知修改了一些代码。它现在更新了文本,但有一些长时间的延迟。我需要幻灯片2-3张图片,然后它才会将文本更新为“我的标题”。我错过了一些东西。。。此外,我如何根据所选图片确定要显示的适当文本,而不是只显示“我的标题”?我刚刚意识到我写的片段
extend Activity
(固定在代码上),它是
onPause
,而不是
onResume()
(也在我的回答中更新)。我先检查一下,好的!完美:)我改为onResume,我想它现在会立即更新。因此,在onResume()中,我应该添加类似于开关大小写的内容,以确定要传递的正确文本?现在它传递一个静态的“我的标题”文本。还是这条路不对?好吧。我将接口方法更改为接受int位置而不是字符串标题。Now onResume()发送一个int位置作为参数,父活动知道现在选择了哪个位置,我可以使用开关大小写来更新正确的文本。但是如果我将ViewPager向左滑动(或者本质上向后滑动),文本将不再更新。。。它卡在最后使用的文本上。如果我快速滑动图片,文本也不会更新。。。我是sooo clooossee…!:)有没有办法解决这个问题?谢谢你Budius!!莱乔的回答很中肯:)哦。。。好的,我现在就试试这个!!:)这是非常有指导意义的。。。我知道这个程序使用一个接口来传递数据是某种设计模式?
public void MyFragment extends Fragment{

    private TitleChangeListener listener;

    @Override
    public void onAttach(Activity activity){
        if(activity instanceof TitleChangeListener)
            listener = (TitleChangeListener)activity;
        else
            // throw some error ???
    }

    @Override
    public void onResume(){
        listener.onTitleChanged("my title");
    }

}
//activity onCreate()
protected void onCreate(Bundle savedInstanceState) {
    ...
    mTextView = (TextView) findViewById(R.id.text_view);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
                String someText = determineText(position)
                mTextView.setText(someText);

    });

    //because onPageSelected will not be called for page 0 first time
    String someText = determineText(0)
    mTextView.setText(someText);
}

private String determineText(int position){ //static?
    //switch?
}