【发布时间】: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