Jeremy Feinstein スライド メニューを使用しています。このメニューを使用して、コードが SettingsFragment (PreferenceFragment を拡張する) というクラスに配置されるデバイス設定ページに移動したいと考えています。
フラグメントを SettingsFragment に切り替えたい場合、コンパイル エラーが発生します。
タイプの不一致: SettingsFragment から Fragment に変換できません
エラーがスローされた場所を見つけるには、コード内で「<- WHERE」を探します。
ContentActivity.java
スライド メニューを作成し、フラグメント プレースホルダーにします。
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
public class ContentActivity extends FragmentActivity {
public static final String TAG = ContentActivity.class.getName();
SlidingMenu slidingMenu;
private Fragment mContent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set the Above View
if (savedInstanceState != null)
mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent");
if (mContent == null) {
SimpleFragment firstWOListFragment = new SimpleFragment();
mContent = firstWOListFragment;
}
//Creates the sliding menu
slidingMenu = new SlidingMenu(this);
slidingMenu.setMode(SlidingMenu.LEFT);
slidingMenu.setShadowWidth(5);
slidingMenu.setFadeDegree(0.0f);
slidingMenu.setBehindWidth(200);
slidingMenu.setShadowWidthRes(R.dimen.shadow_width);
slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
slidingMenu.setTouchModeAbove(SlidingMenu.LEFT);
slidingMenu.setMenu(R.layout.menu_frame);
slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
// Make the left menu appear.
this.getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame, new LeftMenuItemFragment())
.commit();
// set the Above View
setContentView(R.layout.content_frame);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mContent).commit();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
try {
getSupportFragmentManager().putFragment(outState, "mContent", mContent);
} catch (IllegalStateException e) {
Log.e(TAG, "Error on onSaveInstanceState");
}
}
/**
* Replaces the content frame with the fragment given as parameter
* @param fragment
*/
public void switchContent(Fragment fragment) {
mContent = fragment;
// Switch to the new fragment
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();
}
}
LeftMenuItemFragment.java
フラグメントを切り替えるためのスライド メニュー レイアウトとロジック
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class LeftMenuItemFragment extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.list, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] menuItemTitles = { "MENU", "ITEM 1", "SETTINGS" };
ArrayAdapter<String> menuItemAdapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, menuItemTitles);
setListAdapter(menuItemAdapter);
}
@Override
public void onListItemClick(ListView lv, View v, int position, long id) {
Fragment newContent = null;
switch (position) {
case 1:
newContent = new SimpleFragment();
break;
case 2:
newContent = new SettingsFragment();//<- WHERE THE COMPILATION ERROR IS
break;
}
if (newContent != null)
switchFragment(newContent);
}
// the meat of switching the above fragment
private void switchFragment(Fragment fragment) {
if (getActivity() == null)
return;
if (getActivity() instanceof ContentActivity) {
ContentActivity fca = (ContentActivity) getActivity();
fca.switchContent(fragment);
}
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(R.string.settings);
// Set the settings menu
addPreferencesFromResource(R.xml.pref_all);
}
}
SimpleFragment.java
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SimpleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.simple_fragment, container, false);
return view;
}
}
どうやら android.app.fragment と android.support.v4.app.fragment の間に非互換性があります。このスライド メニューは v4.fragment を扱いますが、PreferenceFragment は app.fragment です。
このスライド メニューで app.fragment を処理する方法はありますか? または、このユースケースを処理するために、PreferenceFragment を PreferenceActivity に置き換える必要がありますか? または、これを機能させるための他の解決策はありますか?