【发布时间】:2016-03-26 00:59:57
【问题描述】:
大家好,
[简介] 我创建了一个ScreenSlide Pager(扩展FragmentActivity)来处理MainActivity 中的4 个片段。我还有一项服务,处理蓝牙通信套接字(使用 RPI)。 该服务可以通过 Handler 通知 MainActivity 接收它。
在这里,放在MainActivity中:
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case BtCommunication.MSG_SET_VALUE:
Log.d("SERVICE", "Received from service: " + msg.arg1);
break;
case BtCommunication.MSG_GET_SOCKET_STATE:
if(msg.arg1 == 1){
Log.d("SERVICE", "Socket state: UP");
onSocketUp();
} else {
Log.d("SERVICE", "Socket state: DOWN");}
break;
default:
super.handleMessage(msg);
}
}
}
我有一个片段(MainFragment),它在 OnCreate() 中的任何其他片段之前首先被调用:
if(savedInstanceState == null){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.pager, new MainFragment());
ft.commit();
}
然后,在 MainActivity 的 ScreenSlidePagerAdapter 中对 Fragment 进行这种处理。
@Override
public Fragment getItem(int position) {
Log.d("mPager.getCurrentItem", "" + mPager.getCurrentItem());
if(position == 0){
actionBar.setTitle("Accueil - Connexion");
Log.d("Fragment", "MainFragment");
return new MainFragment();
}else if(position == 1){
actionBar.setTitle("Second fragment");
Log.d("Fragment", "SecondFragment");
return new SecondFragment();
}else if(position == 2){
Log.d("Fragment", "ThirdFragment");
return new ThirdFragment();
}else if(position == 3){
Log.d("Fragment", "ItemFragment");
return new ItemFragment();
}else{
Log.d("Fragment", "ElseFragment (MainFragment)");
return new MainFragment();
}
}
一旦连接套接字启动,我在这个片段中有一个方法来设置不可见/消失的加载动画。 [/简介]
public void onSocketUp(){
ArcLoader.setVisibility(View.GONE);
Log.d("MAIN FRAGMENT","Arc Loader GONE");
}
我假设你猜到了:我希望 在套接字状态从 DOWN 切换到 UP 时从 Activity 调用该方法。
以下是我打架的活动方法。一旦 Handler 检测到来自服务的通知,她就会被正确调用,但我无法调用片段的方法,因为 findfragmentbyId 将 mFrag 作为空片段返回(?!)。
它不应该,因为它是第一个被调用的片段,我不会破坏它留在上面)。
此外,使用事务创建新片段失败(onSaveInstanceState 后无法执行此操作)。
private void onSocketUp()
{
//Fragment mainFrag = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + mPager.getCurrentItem());
Fragment mainFrag = getSupportFragmentManager().findFragmentById(R.id.mainfragment);
Log.d("MAIN ACTIVITY", "onSocketUp()");
if (mPager.getCurrentItem() == 0 && mainFrag != null) {
mainFrag.onSocketUp();
Log.d("SERVICE", "onSocketUp() called - Main Fragment instantiated");
}
else {
MainFragment newFragment = new MainFragment();
Bundle args = new Bundle();
args.putString(MainFragment.ARG_SOCKET_UP, "UP");
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.pager, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
我希望我给了你足够的信息来了解我的问题来自哪里,如果你希望我提供任何额外的代码,请不要犹豫。
到目前为止,我本可以阅读的所有其他主题都没有帮助。
提前谢谢你。
【问题讨论】:
-
在“onSocketUp()”中声明了一个“mainFrag”,但之后使用的是“mFrag.onSocketUp()”。 mFrag 不是您实例化的。或许问题出在这里。
-
已编辑,但这不是问题的根源。
标签: android android-fragments android-viewpager