ViewPager用于通知特定事件的片段的活动

M2X*_*M2X 22 android fragment android-viewpager

我有一个ViewPager,它正在使用a FragmentAdapter来显示相同​​类型的几个片段.尽管这些片段基本上是从同一个类实例化的,但它们使用a ListView来显示不同的信息.(显然,ListView它正被一个人所包围ArrayAdapter.)
后台服务也在运行,并且不断从互联网接收数据.我希望能够ViewPager在我的后台服务通知我特定事件时更新特定的片段.
我怎样才能做到这一点?我们非常感谢您的代码片段!

(顺便说一句,我看到了类似的问题,但我不知道如何使用他们的建议!)

更简单:我使用ViewPager的活动:
[片段0] [片段1] [片段2]

后台服务告诉我(通过广播)来更新ListView的片段1.

编辑: 以下是示例代码:

public class ChatWindowPager extends FragmentActivity
{
    private ViewPager mViewPager = null;
    private ChatFragmentAdapter mAdapter = null;
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_window_pager);

        this.mViewPager = (ViewPager) findViewById(R.id.chatPager);
        this.mAdapter = new ChatFragmentAdapter(getSupportFragmentManager());
        this.mViewPager.setAdapter(this.mAdapter);
        .
        .
        .
    }

    class ChatFragmentAdapter extends FragmentPagerAdapter implements ViewProvider
    {

        public ChatFragmentAdapter(final FragmentManager fm)
        {
            super(fm);
        }

        @Override
        public Fragment getItem(final int arg0)
        {
            String friendId = ..... // Some initializations
            ChatWindowFragment f = ChatWindowFragment.newInstance(friendId);
            return f;
        }

        @Override
        public int getCount()
        {
            ...
        }

        @Override
        public View getView(final int position)
        {
            View v = getLayoutInflater().inflate(R.layout.tab_holder, null);
            .
            .
            .
            return v;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在片段定义如下:

public class ChatWindowFragment extends Fragment
{
    public String friendId;
    private ListView lv;

    public static ChatWindowFragment newInstance(final String friendId)
    {
        ChatWindowFragment chatWindowFragment = new ChatWindowFragment();
        Bundle bundle = new Bundle();
        bundle.putString("friendId", friendId);
        chatWindowFragment.setArguments(bundle);
        return chatWindowFragment;
    }

    @Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.friendId = getArguments().getString("friendId");
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState)
    {
        View v = inflater.inflate(R.layout.chat_window, container, false);

        this.friendId = getArguments().getString("friendId");
        .
        .
        .
        return v;
    }

    //The rest of the class

}
Run Code Online (Sandbox Code Playgroud)

当我使用a时,FragmentPagerAdapter我看不出如何设置每个片段的标签!(显然,我没有使用事务来添加片段!)

编辑2: 我想知道我正在做什么,是正确的方法来处理我想做的事情......也欢迎任何其他解决方案!

Kin*_* RV 40

试试这个,

在所有片段中注册广播接收器......就像这样

创建一个扩展所有类中广播接收器的类,例如:

public class FragmentReceiver1 extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
        }    
}
Run Code Online (Sandbox Code Playgroud)

并在你片段的onCreate中注册这个接收器......

例如. getActivity().registerReceiver(new FragmentReceiver1(), new IntentFilter("fragmentupdater"));

现在为每个片段分配一个唯一的id,如Fragment1为1,Fragment2为2

现在每当你想传递任何数据并更新任何片段时,只需发送一个包含intent的数据和"fragmentupdater"作为intent-filter的广播...

例如:

Intent data = new Intent("fragmentupdater");
data.putString("key","data");
data.putInt("fragmentno",1); // Pass the unique id of fragment we talked abt earlier
activity.sendBroadcast(data);
Run Code Online (Sandbox Code Playgroud)

现在你的每个片段都会收到数据,但是你可以通过我们在onReceive函数中传递的唯一id来验证数据是否是同一个片段...,你得到的意图,是我们上面传递的意图

  • 如果您没有使用多个进程,请考虑使用http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html而不是全局广播.当然,您总是可以实现自己的观察者模式,以便在发生感兴趣的更改时让片段注册服务. (13认同)

Raf*_*l T 5

你有没有尝试过 FragmentManager.findFragmentByTag()

FragmentManager manager = getSupportedFragmentManager();
//with support package, else
//FragmentManager manager = getFragmentManager()
Fragment fragment = manager.findFragmentByTag("Tag You Created the Fragment");
if (fragment instanceof Fragment1){
    Fragment1 fr = (Fragment1)fragment
    fr.updateData(DATA)
    //or any method of your choice
} 
Run Code Online (Sandbox Code Playgroud)

编辑:我仔细阅读!该instanceOf会施放一个Fragment到您的片段类.是你,谁建议Fragment1作为一个简单的名称.此外,您没有提供任何来源来帮助我们.确实,你不能设置Fragment标签,但为什么你认为你能够得到它的标签?通常Fragment是通过FragmentManagers喜欢添加

FragmentManager manager = getSupportedFragmnentManager()
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(int containerViewId, Fragment fragment, String tag);
// or transaction.add(Fragment fragment, String tag)
// ...other transactions
transaction.commit()
Run Code Online (Sandbox Code Playgroud)

EDIT2:虽然很容易.根据你的代码你可以打电话

Fragment fragment = mAdapter.getItem(0) // 0||1||2
Run Code Online (Sandbox Code Playgroud)

您应该考虑阅读文档(即关于FragmenPagerAdapter)并发布您的源代码,这样我们就不必猜测您需要什么.