com.google.android.material.appbar.AppBarLayout$LayoutParams 无法转换为 androidx.coordinatorlayout.widget

Posted

技术标签:

【中文标题】com.google.android.material.appbar.AppBarLayout$LayoutParams 无法转换为 androidx.coordinatorlayout.widget.CoordinatorLayout$LayoutParams【英文标题】:com.google.android.material.appbar.AppBarLayout$LayoutParams cannot be cast to androidx.coordinatorlayout.widget.CoordinatorLayout$LayoutParams 【发布时间】:2021-12-20 03:44:18 【问题描述】:

我使用了 CoordinatorLayout + AppBarLayout,因此工具栏在滚动时可能会消失,并将 Recycler View 放在 tablayout 下方。但是在我更改了模型逻辑并在工具栏中添加了子元素之后,这个致命错误一直在发生。将根布局更改为 LinearLayout 或 FrameLayout 后,错误消失了,但我没有得到想要的行为。 我不会在代码 (MainActivity) 中调用、创建或更改 AppBarLayout 和 CoordinatorLayout 的布局参数。所以堆栈跟踪没有显示任何内部代码行,只是内部类逻辑。 这是 XML:

<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>


<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_
    android:layout_>

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        android:background="?attr/colorPrimary"
        app:contentInsetStart="0dp"
        app:layout_scrollFlags="scroll|snap"
        app:titleTextColor="@android:color/white">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/toolbarBackButton"
                android:layout_
                android:layout_
                android:visibility="invisible"/>

            <TextView
                android:id="@+id/toolbarText"
                android:layout_
                android:layout_
                android:layout_weight="1"
                android:background="@color/colorPrimary"
                android:fontFamily="sans-serif-medium"
                android:gravity="center_vertical"
                android:text="@string/activity_main_toolbar_title"
                android:textColor="@android:color/white"
                android:textSize="20sp" />

            <ImageView
                android:id="@+id/toolbarBucket"
                android:layout_
                android:layout_ />
        </LinearLayout>
    </androidx.appcompat.widget.Toolbar>

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabs"
        android:layout_
        android:layout_
        app:tabBackground="@color/colorPrimary"
        app:tabIndicatorColor="@color/colorIndicator"
        app:tabSelectedTextColor="@color/colorActive"
        app:tabTextColor="@color/colorInactive" />
</com.google.android.material.appbar.AppBarLayout>

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_
    android:layout_
    android:orientation="vertical"
    app:layout_anchor="@id/tabs"
    app:layout_anchorGravity="bottom"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/add_fab"
    android:layout_
    android:layout_
    android:layout_gravity="bottom|right"
    android:layout_margin="@dimen/regularMargin"
    android:src="@drawable/ic_baseline_add_24"
    app:tint="@android:color/white"/></androidx.coordinatorlayout.widget.CoordinatorLayout>

任何线索将不胜感激! 我的主要活动代码

package com.example.loftmoney.screens.main;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import android.content.Intent;
import android.os.Bundle;

import com.example.loftmoney.R;
import com.example.loftmoney.model.Item;
import com.example.loftmoney.screens.additem.AddItemActivity;
import com.example.loftmoney.screens.balance.BalanceFragment;
import com.example.loftmoney.screens.budget.BudgetFragment;
import com.example.loftmoney.screens.main.adapter.FragmentItem;
import com.example.loftmoney.screens.main.adapter.MainPagerAdapter;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements MainClickAdapter, EditModeListener 

    private ViewPager2 viewPager;
    private Toolbar toolbar;
    TabLayout tabs;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupFab();
        setupTabs();
        setupToolbar();
    

    private void setupToolbar() 
        toolbar = findViewById(R.id.toolbar);
    

    private void setupTabs() 
        List<FragmentItem> fragments = setupFragments();

        tabs = findViewById(R.id.tabs);
        viewPager = findViewById(R.id.viewPager);
        MainPagerAdapter adapter = new MainPagerAdapter(fragments, this, 0);//behavior?
        viewPager.setOffscreenPageLimit(fragments.size());
        viewPager.setAdapter(adapter);

        new TabLayoutMediator(tabs, viewPager,
                (tab, position) -> tab.setText(
                        fragments.get(position).getTitle()
                )
        ).attach();
    

    private List<FragmentItem> setupFragments() 
        List<FragmentItem> fragments = new ArrayList();
        fragments.add(new FragmentItem(new BudgetFragment(), getString(R.string.expenses), Item.ItemType.EXPENSE));
        fragments.add(new FragmentItem(new BudgetFragment(), getString(R.string.incomes), Item.ItemType.INCOME));
        fragments.add(new FragmentItem(new BalanceFragment(), getString(R.string.balance)));
        return fragments;
    

    private Fragment getActiveFragment() 
        final int activeFragmentIndex = viewPager.getCurrentItem();
        Fragment activeFragment = (BudgetFragment) getSupportFragmentManager().getFragments().get(activeFragmentIndex);
        return activeFragment;
    

    private void setupFab() 
        FloatingActionButton addFab = findViewById(R.id.add_fab);
        addFab.setOnClickListener(v -> onFabClick());
    

    @Override
    public void onFabClick() 
        BudgetFragment activeFragment = (BudgetFragment) getActiveFragment();
        Intent intent = new Intent(MainActivity.this, AddItemActivity.class).putExtra("type", activeFragment.type);
        activeFragment.startActivityForResult(intent, BudgetFragment.LAUNCH_ADD_ITEM);
    

    @Override
    public void onEditModeChangeListener(boolean status) 
        toolbar.setBackgroundColor(getApplicationContext().getColor(
                status ? R.color.editModeColor : R.color.colorPrimary));
    

【问题讨论】:

这是LayoutParams 的错误导入/转换问题,您使用的是AppBar,但您导入的是ConstraintLayoutLayoutParams。您尚未共享代码,请先共享。 我添加了 MainActivity 代码 【参考方案1】:

这是因为我设置了一个锚。 我已经删除了这两行,一切正常

app:layout_anchor="@id/tabs"
app:layout_anchorGravity="bottom"

【讨论】:

以上是关于com.google.android.material.appbar.AppBarLayout$LayoutParams 无法转换为 androidx.coordinatorlayout.widget的主要内容,如果未能解决你的问题,请参考以下文章