从父活动调用Fragment方法

时间:2017-07-04 12:08:44

标签: android android-fragments

我想调用(tabbed)片段方法将数据带到活动状态。

  1. 我看过this
    • 但我得到空对象引用
  2. 我试过this
    • 但是我的活动已经在实现片段类,所以它不是一个合法的表达式
  3. 因此,当更改选项卡时,我希望第一个选项卡的表单通过getDetails()方法

    发送到Activity的详细信息
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                if (tab.getText().equals("Owner")) {
                    //invoking method here
                    Log.i(TAG, tab.getText().toString() + " unselected");
                }
    

    我尝试使用FragmentManager但没有运气,请帮忙!

    编辑 - 这是我想要调用的方法

    public Bundle getData() {
        Bundle bundle = new Bundle();
        bundle.putString("area", area);
        bundle.putString("villageTown", villageTown.getSelectedItem().toString());
        bundle.putString("ownerName", ownerName);
        bundle.putString("fatherHusbandName", fatherHusbandName);
        bundle.putString("category", category.getSelectedItem().toString());
        bundle.putString("address", address);
        bundle.putString("mobileNumber", mobileNumber);
        bundle.putString("telephoneNumber", telephoneNumber);
    
    
        return bundle;
    }
    

3 个答案:

答案 0 :(得分:1)

我假设您使用ViewPager绑定到Tab。首先,您需要保留您在ViewPager中使用的片段实例。

我解释了如何在此答案中获取您在ViewPager中使用的片段实例。 https://stackoverflow.com/a/39274141/1559852

您的问题需要不同的onPageChangeListener实施。您需要保留lastSelectedPosition ViewPager,并在选择页面后将您的数据发送到活动,然后更新lastSelectedPosition。这是一个示例实现

    int lastSelectedPosition = viewPager.getCurrentItem();

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            // Here's your instance
            YourFragment fragment =(YourFragment)yourPagerAdapter.getRegisteredFragment(lastSelectedPosition);
            // Here're your details. You can update.
            YourDetails details = yourFragment.getDetils();
            lastSelectedPosition = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

我希望这对你有帮助。祝你好运。

答案 1 :(得分:1)

@Override
        public void onTabUnselected(TabLayout.Tab tab) {
            if (tab.getText().toString().equalsIgnoreCase("owner")) {
                OwnerForm frag = (OwnerForm) getSupportFragmentManager().getFragments().get(0);
                bundle = frag.getData();
            }

            Log.i(TAG, tab.getText().toString() + " says hi"); //test statement
        }

使用getFragments().get()为我做了诀窍,我不知道FragmentManager会保留所有活动片段的列表,因此您不必使用导致空对象错误的getFragmentById()。 / p>

答案 2 :(得分:0)

我强烈建议将片段逻辑保留在片段中。从活动调用类的片段可以通过多种方式完成,如接口。但是,调用片段方法的Activity会导致问题。当你特别试图找到一个未在屏幕上显示的片段方法时。

但是,您可以在填写表单时将数据写入片段中的共享首选项,并且当调用onTabUnselected时,您可以从活动中的共享首选项中读取数据。我承认这不是一个好的解决方案。我希望我能正确理解你的问题。