我使用两个不同的库来实现相同的功能,可以通过app风格选择。所以我为这两种风格创建了一个接口类:
public class Compat
{
public static abstract class ActionBar extends android.support.v7.app.ActionBar {}
public static abstract class FragmentManager extends android.support.v4.app.FragmentManager {}
public static abstract class ActionBarActivity extends android.support.v7.app.ActionBarActivity
{
public FragmentManager getCompatFragmentManager()
{
return (FragmentManager) getSupportFragmentManager(); // <-- error
}
public ActionBar getSupportActionBar()
{
return (ActionBar) super.getSupportActionBar(); // <-- error
}
}
public static class Fragment extends android.support.v4.app.Fragment {}
}
基本上这个课只会创造一堆已知的&#34;这些类只是其真正底层基础的别名。当然,真正的基础基础永远不能在这个类之外导入。所有进一步的代码仅使用这些&#34;已知&#34;从中派生并执行其他操作的类。
稍后在MainActivity.java中:
class MainActivity extends Compat.ActionBarActivity {
void doSomething()
{
Compat.ActionBar ab = getSupportActionBar();
...
}
}
正如您所看到的,如果我希望我的Compat.ActionBarActivity从android.support.v7.app.ActionBarActivity
派生一次,而从android.support.v4.app.FragmentActivity
派生另一次,我无法在MainActivity.java中包含这两者。我只包含Compat.java并使用那里声明的类。
除了指出的错误的类型转换之外,一切都运行良好。那些抛出异常,如
Caused by: java.lang.ClassCastException: android.support.v4.app.FragmentManagerImpl cannot be cast to com.velis.library.Compat$FragmentManager
当然getSupportFragmentManager
并没有返回我的类型的对象,但我确定可以做些什么来实现它?或者,有没有其他方法可以让一个未知的类知道?
编辑:我当前的解决方案(包装类):
import android.support.v4.app.FragmentActivity;
public class Compat
{
public static class ActionBar
{
public android.app.ActionBar a;
ActionBar(android.app.ActionBar ab) { a = ab; }
}
public static abstract class ActionBarActivity extends FragmentActivity
{
public android.app.FragmentManager getCompatFragmentManager()
{
return getFragmentManager();
}
public ActionBar getCompatActionBar()
{
return new ActionBar(getActionBar());
}
public void supportInvalidateOptionsMenu()
{
invalidateOptionsMenu();
}
}
public static class Fragment extends android.app.Fragment {}
}
和MainActivity.java:
public class MainActivity extends Compat.ActionBarActivity
{
....
public void restoreActionBar()
{
Compat.ActionBar actionBar = getCompatActionBar();
actionBar.a.setNavigationMode(actionBar.a.NAVIGATION_MODE_STANDARD);
actionBar.a.setDisplayShowTitleEnabled(true);
actionBar.a.setTitle(mTitle);
}
....
}
使用该公共成员并不完美,但到目前为止它仍然有效。这个问题是关于如何使这更漂亮。