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

Programmatically set AppBarLayout causes java.lang.IllegalArgumentException requiring Theme.AppCompat (or a descendant)

AppBarLayout 原因:"java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.AppCompat (or a descendant)." 我知道有很多类似的问题有很多答案,但 none 似乎对我有用。 我已经尝试了所有方法:扩展 AppCompatActivity、将主题设置为 Theme.AppCompat、清理项目、重置缓存、重新启动 Android 工作室、四处游荡…… 我很绝望。所以,如果您不知道答案,请不要仅仅为了获得分数而回复。 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>

主要活动

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());
}}

您正在使用 getApplicationContext(),它没有 AppCompat 主题(或根本没有任何主题)。使用 this 而不是将 Activity 用作上下文对象。

stgConstraintLayout mainLayout = new stgConstraintLayout(this);