【问题标题】:Can't switch PreferenceFragment from ActionBarActivity无法从 ActionBarActivity 切换 PreferenceFragment
【发布时间】:2015-03-10 21:47:35
【问题描述】:

您好,我有一个扩展 ActionBarActivity 的活动。这个,有一个ViewPager 使用PagerSlidingTabStrip 库。我正在使用 AppCompat v21,所以我需要扩展 ActionBarActivity 才能使用工具栏。顺便说一句.. 我有两个 PreferenceFragment 需要放在这个 viewpager 中。

    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 冲突

【问题讨论】:

  • 你能显示你的 LogCat 输出吗
  • 我没有logcat,因为错误已经结束return new MainPrefFragment();return new AppearencePrefFragment();

标签: android android-viewpager android-appcompat preferencefragment


【解决方案1】:

您可以将PreferenceFragmentgetFragmentManager 一起使用,即使您使用的是ActionBarActivity(当然是在11 以上的API 上)。

但我收到如下错误:类型不匹配:无法从 AppearencePrefFragment 转换为 Fragment ...

问题是FragmentPagerAdapter 只需要片段管理器的支持或本机实现。这意味着您不能在寻呼机内组合原生和支持片段。

选项 1: 使用原生(咳咳......我的意思是 support-v13)FragmentPagerAdapter 并将所有片段转换为原生。

这个词是虽然在原生片段实现中存在一些错误,但 API 不同,所以我不会选择这个选项。

选项 2: 使用支持 (support-v4) FragmentPagerAdapterPreferenceFragment 的支持版本。

在您的模块 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。请注意,尽管它的名字不是官方的反向移植,但我已经相当成功地使用了一段时间。

【讨论】:

  • 但是如果我包含support-v7,为什么我必须使用support-v4?
  • ActionBarActivity from appcompat-v7 extends FragmentActivity from support-v4,两者都使用来自support-v4的支持片段。你正在使用support-v4 甚至不知道它;)
  • 只有一个问题,我用的是eclipse而不是android studio :(
  • 在这种情况下克隆 this GitHub project 并将其作为库导入到您的 Eclipse 项目中。然后让你的应用依赖这个库。
  • 或选项 2:切换到 AS :D
猜你喜欢
  • 2015-03-05
  • 2015-11-28
  • 2015-08-05
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多