使用SlidingMenu与ActionBarSherlock遇资源重复定义编译错误求助
从你贴出的编译错误来看,核心问题是ActionBarSherlock(ABS)和appcompat-v7库定义了重复的Android资源属性(比如attr/background、attr/navigationMode等),导致AAPT编译失败。降级appcompat-v4到18没用,是因为冲突的根源在appcompat-v7,而且ABS本身是独立的ActionBar兼容库,和新版support库完全不兼容。
为什么会出现这个问题?
ActionBarSherlock是一个老旧的第三方库,专门用于在Android 2.x版本上提供ActionBar支持,但它的内部实现已经包含了和appcompat-v7重复的资源属性。当你同时引入ABS和appcompat-v7时,两个库的资源会直接冲突,AAPT无法处理重复定义的属性。
具体解决方案
方案1:移除appcompat-v7,只保留ActionBarSherlock
因为ABS已经自带了ActionBar的兼容实现,不需要再依赖appcompat-v7:
- 打开你的
build.gradle(Module级别),删除所有包含appcompat-v7的依赖项,比如:implementation 'com.android.support:appcompat-v7:28.0.0' - 将
compileSdkVersion和targetSdkVersion调整为与ABS 4.4.0匹配的版本(Android 19,API 19):android { compileSdkVersion 19 defaultConfig { targetSdkVersion 19 // 其他配置... } } - 同步Gradle并重新编译项目。
方案2:放弃ActionBarSherlock,改用官方DrawerLayout实现侧滑菜单
ActionBarSherlock已经停止维护多年,官方现在推荐使用DrawerLayout配合appcompat库来实现侧滑菜单,这是更稳定且兼容现代Android版本的方案:
- 移除ActionBarSherlock的依赖项,保留(或迁移到AndroidX的)appcompat库:
// 如果你还在使用support库 implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:drawerlayout:28.0.0' // 推荐迁移到AndroidX implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.drawerlayout:drawerlayout:1.2.0' - 在布局文件中使用
DrawerLayout包裹主内容和侧滑菜单:<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主内容布局 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 你的主界面内容 --> </LinearLayout> <!-- 侧滑菜单布局 --> <LinearLayout android:id="@+id/slide_menu" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start"> <!-- 侧滑菜单内容 --> </LinearLayout> </androidx.drawerlayout.widget.DrawerLayout> - 在Activity中用
ActionBarDrawerToggle关联Drawer和ActionBar:public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = findViewById(R.id.drawer_layout); drawerToggle = new ActionBarDrawerToggle( this, drawerLayout, R.string.open_menu, R.string.close_menu ); drawerLayout.addDrawerListener(drawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); drawerToggle.syncState(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } }
处理额外警告
对于警告ignoring element 'g' with unknown namespace,检查你的values.xml文件(路径:D:\AndroidStudio\NNY\neredeNeYenir_Datetimepicker\build\intermediates\packaged_res\debug\values\values.xml),找到带有g标签的部分,确保它的命名空间是正确的,或者直接删除无用的g标签。
内容的提问来源于stack exchange,提问作者muhammad arham Khan

