错误的第二个参数类型:从片段内调用.replace()

时间:2016-11-30 05:08:49

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

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

我得到了经典"错误的第二个参数类型"当我尝试从其他一个片段中启动一个Preference Menu片段时出错。

不幸的是,即使完成了该问题中接受的答案(调用FragmentManager fragmentManager = getSupportFragmentManager()并导入android.support.v4.app.FragmentManager;),我仍然会看到"错误的第二个参数类型"我打电话时出错。 replace()。

快速概述:我的MainActivity.java打开一个片段viewpager(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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你的FragmentManager是v4类型而FragmentSettingsMenu不是v4类型。它不允许。在活动中尝试以下行。

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

。这个link here

它可能会给你一些帮助。