从父活动

时间:2016-03-26 00:59:58

标签: android android-fragments android-viewpager

大家好,

[简介] 我创建了一个ScreenSlide Pager(扩展FragmentActivity)来处理MainActivity中的4个片段。我也有一个服务,处理蓝牙通信插座(带RPI)。 此服务可以通知MainActivity,它通过Handler接收它。

在此处,置于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中以这种方式处理片段。

@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();
            }
        }

虽然套接字不亮,我希望他显示加载动画(动画效果很好):animation loader

一旦连接套接字UP,我在这个片段中有一个方法来设置不可见/已加载动画。 [/简介】

public void onSocketUp(){
        ArcLoader.setVisibility(View.GONE);
        Log.d("MAIN FRAGMENT","Arc Loader GONE");
    }

我猜你猜对了:每当套接字状态从DOWN切换到UP时,我都希望从活动中调用该方法

以下是我与发生争吵的活动方法。一旦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();
        }
    }

我希望我能够提供足够的信息来解决我的问题所在,如果您希望我提供任何其他代码,请不要犹豫。

到目前为止,我可以阅读的所有其他主题都没有帮助。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

如果要从活动中调用片段方法,请执行以下操作:

Fragment  fragment = getSupportFragmentManager().findFragmentById(R.id.mainfragment);

if (fragment instanceof MainFragment){
  ((MainFragment)fragment).onSocketUp();
}