【问题标题】:Wrong 2nd argument type: calling .replace() from within fragment错误的第二个参数类型:从片段内调用 .replace()
【发布时间】:2016-11-30 05:08:48
【问题描述】:

我知道这个问题经常被问到,但没有一个被接受的解决方案对我有用。 (reference solution)

当我尝试从我的其他片段之一中启动首选项菜单片段时,我遇到了经典的“第二个参数类型错误”错误。

不幸的是,即使按照该问题中公认的答案建议(调用FragmentManager fragmentManager = getSupportFragmentManager() 并导入android.support.v4.app.FragmentManager;,当我调用.replace() 时,我仍然会看到“错误的第二个参数类型”错误。

快速概览:我的 MainActivity.java 打开一个片段视图分页器 (MenuPager.java),当在 FragmentTrackRecordMenu.java(MenuPager 的一个子片段)中单击一个按钮时,我尝试从中启动另一个片段 (FragmentSettingsMenu.java)。 java)。

我的代码如下。当单击菜单按钮(在 FragmentTrackRecord 内)时,我尝试启动设置菜单片段,但我无法解决上述编译器错误。如何从此 onClick 成功显示我的 PreferencesFragment?

MainActivity.java

import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {
    public static ViewPager menuPager;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        menuPager = (ViewPager) findViewById(R.id.pager);
        PagerAdapter pageAdapter = new MenuPagerAdapter(getSupportFragmentManager());
        menuPager.setAdapter(pageAdapter);
        ...
    }
}

MenuPagerAdapter.java

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MenuPagerAdapter extends FragmentPagerAdapter {

    public MenuPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        switch (arg0) {
            case 0:
                return new FragmentNeckDisplayMenu();
            case 1:
                return new FragmentCapoMenu();
            case 2:
                return new FragmentTrackRecordMenu();
            default:
                break;
        }
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }
}

FragmentTrackRecordMenu.java

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;

    public class FragmentTrackRecordMenu extends Fragment {
        private Button menuIcon;

    public FragmentTrackRecordMenu(){    }   //default constructor

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

        menuIcon = (Button) v.findViewById(R.id.menuIcon);
        menuIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { //open popup window
                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(android.R.id.content, new FragmentSettingsMenu()) //COMPILER ERROR
                        .commit();
            }
        });
    }
}

FragmentSettingsMenu.java

    public class FragmentSettingsMenu extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from the XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

【问题讨论】:

  • 您的 FragmentManager 是 v4 类型,而 FragmentSettingsMenu 不是 v4 类型。因此它不允许。
  • @RushiAyyappa 有没有办法让 FragmentSettingsMenu 使用 v4 库?我从谷歌教程中获取了该代码,所以我不熟悉如何进行更改。

标签: java android android-fragments sharedpreferences android-preferences


【解决方案1】:

getSupportFragmentManager() 返回 android.support.v4.app.FragmentManager 的片段管理器,而您的 FragmentSettingMenu.java 属于 android.app.Fragment。这就是“错误的第二个参数类型”错误的原因,因为它们不兼容。

【讨论】:

  • 那么解决方法是什么?我是否以某种方式更改 FragmentSettingsMenu?
  • 要么使用 getFragmentManager() 代替 getSupportFragmentManager() 要么使用 android.support.v4.app.Fragment 扩展 FragmentSettingsMenu
【解决方案2】:

您的 FragmentManager 属于 v4 类型,而 FragmentSettingsMenu 不是 v4 类型。因此它不允许。在活动中尝试以下行。

 getFragmentManager().beginTransaction().replace(android.R.id.content,
            new PrefsFragment()).commit();

.试试这个link here

它可能会给你一些帮助。

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多