java - 无法从 Activity 访问 fragment 方法

标签 java android android-fragments

所以,我又回到了尝试从 Activity 中更新 fragment 中的 EditText 内容。 我应该使用它的位置从 viewpager 中获取正确的 fragment 对象,但是调用的方法 drawSurname(surname) 仍然给我“无法解决”错误。

FormActivity中的相关代码;

//initialise pager for swipe screens
        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        adapter = new MyPagerAdapter(getSupportFragmentManager());
        pager.setAdapter(adapter);

public void DrawText() {
        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();

        if (user.size() != 0) {
            Log.e(TAG, "string surname: " + surname);

            // Displaying the user details on the screen
            Fragment n = adapter.getRegisteredFragment(0);
            n.drawSurname(surname);

        }else{
            Log.e(TAG, "table empty");
        }
    }

public class MyPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

        public MyPagerAdapter(FragmentManager fm) {

            super(fm);
        }

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

                case 0: return FirstFragment.newInstance("@string/form_instruct");
                case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
                case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
                case 3: return FourthFragment.newInstance("FourthFragment, Instance 1");
                //case 4: return FifthFragment.newInstance("ThirdFragment, Instance 3");
                default: return FirstFragment.newInstance("FirstFragment, Default");
            }
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }

        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }

FirstFragment.java

public class FirstFragment extends android.support.v4.app.Fragment {

    //create variables & Logcat tag
    private static final String TAG = FirstFragment.class.getSimpleName();
    private EditText inputTitle;
    private EditText inputName;
    private EditText inputSurname;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_first, container, false);

        //set inputs for fields
        inputTitle = (EditText) v.findViewById(R.id.titleText);
        inputName = (EditText) v.findViewById(R.id.foreText);
        inputSurname = (EditText) v.findViewById(R.id.surnameText);

        TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
        tv.setText(getArguments().getString("msg"));

        inputSurname = (EditText) getActivity().findViewById(R.id.surnameText);

        return v;
    }
    public static FirstFragment newInstance(String text) {

        FirstFragment f = new FirstFragment(text);
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }

    public void drawSurname(String x) {

        inputSurname.setText(x);
    }
}

我确定我已经使用 getRegisteredFragment() 正确地获取了 fragment ,但不明白为什么该方法不会调用其他方法。

最佳答案

问题是因为 Fragment 类不应该有一个名为 drawSurname 的函数,而 FirstFragment 有。要解决此问题,请创建一个扩展 Fragment 的抽象类,称为 SuperFrag,您的所有自定义 fragment 都将从中继承。在 SuperFrag 中添加一个名为 drawSurname 的函数。您可以在继承类中覆盖它。最后 SparseArray 应该是 SuperFrag 的列表

关于java - 无法从 Activity 访问 fragment 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30280735/

相关文章:

java - 使用PowerMock编写单元测试,mocked方法调用失败

java - jython 无法列出错误

java - 如何在Java中从控制台读取单个字符(随着用户键入字符)?

android - 在我的 Activity 中打开 Android 通话记录

java - Android Retrofit 2 发布请求响应以及响应类名称

android - Android 中的 'new Fragment()' 和 'Fragment.getInstance()' 有什么区别?

java - Objective-C 到 Java 交叉编译器

android - 如何在android studio中创建一个菱形按钮

android - 必须在主题中为 PreferenceFragmentCompat 指定 preferenceTheme

android - 调用 findViewById() 获取 fragment View 时出现 NullPointerException