以编程方式设置的AppBarLayout导致java.lang.IllegalArgumentException需要Theme.AppCompat(或其后代)

问题描述 投票:0回答:1

AppBarLayout原因:“ java.lang.IllegalArgumentException:此组件上的样式要求您的应用程序主题为Theme.AppCompat(或后代)。”我知道很多类似的问题都有很多答案,但是似乎没有一个对我有用。我已经尝试了所有方法:扩展AppCompatActivity,将主题设置为Theme.AppCompat,清理项目,重置缓存,重新启动Android Studio,四处逛逛...我很绝望。因此,请,如果您不知道答案,请不要仅仅为了获得积分而回答。minSdk-23,目标-28

依赖项

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
implementation 'androidx.transition:transition:1.2.0'
implementation 'androidx.percentlayout:percentlayout:1.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation group: 'com.fasterxml', name: 'jackson-module-json-org', version: '0.9.1'

AndroidManifest.xml

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Descendant">
    <activity android:name="com.example.no_xml.MainActivity" android:theme="@style/Descendant">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

styles.xml

<resources>
<style name="AppBaseTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/stgWhite</item>
</style>
<style name="Descendant" parent="AppBaseTheme">
</style>

MainActivity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setUpMainContainer();
}

private void setUpMainContainer(){
    getWindow().setStatusBarColor(getResources().getColor(R.color.stgTransparent, null));
    stgConstraintLayout mainLayout = new stgConstraintLayout(getApplicationContext());
    mainLayout.setFitsSystemWindows(true);
    setContentView(mainLayout);
    CoordinatorLayout mainCoordinator = new stgCoordinatorLayout(getApplicationContext());
    FrameLayout bottomNaviContainer = new stgFrameLayout(getApplicationContext());
    mainLayout.addView(mainCoordinator, 0);
    mainLayout.addView(bottomNaviContainer, 1);
    ConstraintSet set = new ConstraintSet();
    set.clone(mainLayout);
    set.connect(bottomNaviContainer.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM);
    set.connect(bottomNaviContainer.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START);
    set.connect(bottomNaviContainer.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
    set.connect(mainCoordinator.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP);
    set.connect(mainCoordinator.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START);
    set.connect(mainCoordinator.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
    set.connect(mainCoordinator.getId(), ConstraintSet.BOTTOM, bottomNaviContainer.getId(), ConstraintSet.TOP);
    set.applyTo(mainLayout);
}}

调用AppBarLayout

public class stgCoordinatorLayout extends CoordinatorLayout {
public stgCoordinatorLayout(@NonNull Context context) {
    super(context);
    setupLayout(context);
}

public stgCoordinatorLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    setupLayout(context);
}

public stgCoordinatorLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setupLayout(context);
}

private void setupLayout(Context context){
    CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(
            LayoutParams.MATCH_PARENT,
            0
    );
    params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
    setLayoutParams(params);
    setBackgroundColor(context.getResources().getColor(R.color.stgWhite, null));
    setId(View.generateViewId());

    ViewPager viewPager = new stgViewPager(context);
    addView(viewPager, 0);
    viewPager.requestLayout();
    AppBarLayout appBarLayout = new stgAppBar(context);
    addView(appBarLayout, 1);
}}

AppBarLayout本身

public class stgAppBar extends AppBarLayout {
public stgAppBar(Context context) {
    super(context);
    setupLayout(context);
}

public stgAppBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    setupLayout(context);
}

private void setupLayout(Context context){
    AppBarLayout.LayoutParams params = new AppBarLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            setDP(context, 150)

    );
    setLayoutParams(params);
    setElevation(0);
    setFitsSystemWindows(true);
    setBackgroundColor(context.getResources().getColor(R.color.stgWhite, null));
    setId(View.generateViewId());
}}
android android-appbarlayout
1个回答
1
投票

您正在使用getApplicationContext(),它没有AppCompat主题(或根本没有任何主题)。使用this代替将您的Activity用作Context对象。

stgConstraintLayout mainLayout = new stgConstraintLayout(this);
© www.soinside.com 2019 - 2024. All rights reserved.