Не удается переключить PreferenceFragment из ActionBarActivity
Привет у меня есть активность, которая расширяется ActionBarActivity
, Этот, имеет ViewPager
с помощью PagerSlidingTabStrip
библиотека. Я использую AppCompat v21, поэтому мне нужно расширить ActionBarActivity для использования панели инструментов. Кстати.. У меня есть два PreferenceFragment, которые мне нужно положить в этот просмотрщик.
import com.astuetz.PagerSlidingTabStrip;
import com.zst.app.multiwindowsidebar.preference.*;
import com.zst.app.multiwindowsidebar.sidebar.SidebarService;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.transition.Explode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.annotation.SuppressLint;
import android.content.Intent;
//import android.support.v13.app.FragmentPagerAdapter;
public class MainActivity extends FragmentActivity {
public static final int MENU_TOGGLE = 1;
public enum PAGES {
MAIN(0),
APPEARENCE(1);
final int position;
PAGES(int pos) {
position = pos;
}
};
MyPagerAdapter mPageAdapter;
// Add
Toolbar toolbar;
public static PagerSlidingTabStrip tabs;
public ViewPager pager;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition( new Explode() );
getWindow().setExitTransition( new Explode() );
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tabbed);
toolbar = (Toolbar) findViewById(R.id.toolbar);
mPageAdapter = new MyPagerAdapter(getSupportFragmentManager());
pager = (ViewPager)findViewById(R.id.pager);
tabs = (PagerSlidingTabStrip)findViewById(R.id.tabs);
pager.setAdapter(mPageAdapter);
tabs.setViewPager(pager);
pager.setOffscreenPageLimit(2);
mPageAdapter.notifyDataSetChanged();
pager.invalidate();
}
// My adapter
public class MyPagerAdapter extends FragmentPagerAdapter {
private final String[] TITLES = { "Home", "Interfaccia" };
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MainPrefFragment();
case 1:
return new AppearencePrefFragment();
}
return null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, MENU_TOGGLE, 0, R.string.pref_toggle_service_title)
.setIcon(SidebarService.isRunning ?
R.drawable.ic_menu_toggle_off : R.drawable.ic_menu_toggle_on)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_TOGGLE:
if (SidebarService.isRunning) {
SidebarService.stopSidebar(this);
item.setIcon(R.drawable.ic_menu_toggle_on);
} else {
startService(new Intent(this, SidebarService.class));
item.setIcon(R.drawable.ic_menu_toggle_off);
}
}
return super.onOptionsItemSelected(item);
}
}
Но я получаю ошибки как: Type mismatch: cannot convert from AppearencePrefFragment to Fragment
... Как я могу сделать?
PS: я пытался импортировать support-v13, но, кажется, сталкиваются с v7
1 ответ
Ты можешь использовать PreferenceFragment
с getFragmentManager
даже если вы используете ActionBarActivity
(по API выше 11 конечно).
Но я получаю ошибки как: Несоответствие типов: не могу преобразовать из AppearencePrefFragment в Fragment ...
Проблема заключается в FragmentPagerAdapter
принимает только поддержку или нативную реализацию диспетчера фрагментов. Это означает, что вы не можете комбинировать нативные и вспомогательные фрагменты внутри пейджера.
Вариант 1: использовать нативный (хм.. я имею в виду support-v13) FragmentPagerAdapter
и конвертировать все ваши фрагменты в родной.
Слово есть, хотя есть некоторые ошибки в реализациях собственных фрагментов, меняющихся в зависимости от API, поэтому я бы не стал выбирать эту опцию.
Вариант 2. Использование поддержки (support-v4) FragmentPagerAdapter
и версия поддержки PreferenceFragment
,
Добавьте следующую зависимость в ваш модуль build.gradle
файл
compile('com.android.support:support-v4-preferencefragment:1.+@aar') {
exclude module: 'support-v4'
}
Добавьте свой репозиторий в ваш проект build.gradle
файл
allprojects {
repositories {
mavenLocal()
maven {
// this is the one
url "https://raw.github.com/kolavar/android-support-v4-preferencefragment/master/maven-repository/"
}
jcenter()
}
}
Наконец, ваш фрагмент предпочтений расширяется android.support.v4.preference.PreferenceFragment
вместо android.preference.PreferenceFragment
, Обратите внимание, что, несмотря на название, это не официальный бэкпорт, но я уже довольно успешно его использую.