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来验证数据是否是同一个片段...,你得到的意图,是我们上面传递的意图
你有没有尝试过 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)并发布您的源代码,这样我们就不必猜测您需要什么.
| 归档时间: |
|
| 查看次数: |
17955 次 |
| 最近记录: |