【问题标题】:Call a fragment's method from parent activity从父活动调用片段的方法
【发布时间】: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


【解决方案1】:

如果您想从活动中调用片段方法,只需执行以下操作:

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

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

【讨论】:

  • if 条件不满足。但是,调用了 findFragmentbyId。我不明白为什么。
  • 我已经发布了通用方法,但对于您的示例,我认为您的架构需要进行审查。如果您的onSocketUp 是整个片段所必需的,请将其提取到您的主要活动中
  • 我将如何对来自活动的片段执行操作?
  • 你可以像这个例子一样在活动和片段之间实现回调:gist.github.com/butelo/8729891(推荐)或者只是从你的片段中调用 ((MyActivity)getActivity()).something()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多