使用actionbarsherlock和android-support-v4(版本23)

时间:2016-02-18 05:35:57

标签: android actionbarsherlock android-support-library

我正在开发一个带有actionbarsherlock的应用程序,而ABS项目目前正在使用android-support-v4库(版本18)。现在我想扩展我的项目以支持Android 6.0,并使用一些方法,如

ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)

ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)

我需要支持库版本23.但ABS项目与此最新库不兼容,并且在Watson.java中出现 mAdded无法解析或不是字段等错误

此外,请不要建议我使用AppCompatActivity而不是ABS,因为我尝试了它,但因为我的项目非常大而陷入其他乱七八糟的网络中。

1 个答案:

答案 0 :(得分:7)

我面临同样的问题。这是我的解决方案:

克隆ActionBarSherlock

没有类型为Landroid / support / v4 / app / FragmentManagerImpl的实例字段mFragments;

// android.support.v4.app.FragmentActivity

// com.android.support:support-v4:22.+
final FragmentManagerImpl mFragments = new FragmentManagerImpl();

// com.android.support:support-v4:23.+
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

// android.support.v4.app.FragmentManager.FragmentManagerImpl
ArrayList<Fragment> mAdded;

所以我们需要获取 FragmentManagerImpl 的实例来访问 mAdded 字段

// android.support.v4.app.FragmentActivity
public FragmentManager getSupportFragmentManager() {
    return mFragments.getSupportFragmentManager();
}

// android.support.v4.app.FragmentController
public FragmentManager getSupportFragmentManager() {
    return mHost.getFragmentManagerImpl();
}

将以下方法添加到android.support.v4.app.Watson类

@Nullable
private List<Fragment> getAddedFragments() {
    return ((FragmentManagerImpl) getSupportFragmentManager()).mAdded;
}

将以下代码添加到 onCreatePanelMenu onPreparePanel onMenuItemSelected 方法,并将 mFragments.mAdded 替换为片段

List<Fragment> fragments = getAddedFragments();

FloatMath

  

从历史上看,这些方法比同等的双重方法更快    {java.lang.Math}方法。在带有JIT的Android版本上    变得越来越慢,并且已经重新实现以包装调用    {} java.lang.Math中。应该使用{java.lang.Math}    偏好。

     

所有方法都从版本23中的公共API中删除。

     

@deprecated改为使用{java.lang.Math}。

将所有出现的 FloatMath 替换为 com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy

中的 Math