数据绑定不适用于覆盖 BottomNavActivity 的 BaseActivity setContentView 调用了两次

如何解决数据绑定不适用于覆盖 BottomNavActivity 的 BaseActivity setContentView 调用了两次

活动不工作,因为 setContentView 被调用了两次。

这是我的activity_main布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.view.View"/>
       <variable
           name="viewmodel"
           type="com.project.viewmodel.Mainviewmodel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/pullToRefresh"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginTop="?attr/actionBarSize"
            android:background="@color/transparent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toTopOf="@id/bottom_nav">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/content_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                  <androidx.viewpager.widget.ViewPager
                    android:id="@+id/view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:clipToPadding="false"
                    android:foregroundGravity="center"
                    android:overScrollMode="never"
                    app:layout_constraintBottom_toTopOf="@+id/tabLayout"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/search_image_view"
                    android:visibility="@{safeUnBox(viewmodel.dataLoading) ? View.VISIBLE : View.VISIBLE}"/>
         
            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_nav"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginTop="@dimen/_5sdp"
            android:background="@drawable/bottom_nav_background"
            android:clipChildren="false"
            android:visibility="visible"
            app:elevation="8dp"
            app:labelVisibilityMode="labeled"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintVertical_bias="1"
            app:menu="@menu/bottom_nav" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MainActivity.kt

class MainActivity : BottomNavActivity() {
    private lateinit var binding: ActivityWeatherNewBinding

    override fun getContentViewId(): Int {
        return R.layout.activity_main
    }

    override fun getNavigationMenuItemId(): Int {
        return R.id.nav_main
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        super.onCreate(savedInstanceState)
}
}

BottomNavigationActivity.java 用于设置再次调用 setContentView 的 BottomNavigation。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());
        bottomNavigationView = findViewById(R.id.bottom_nav);
        bottomNavigationView.setonNavigationItemSelectedListener(this);
    }
 @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        int currentItemId = getNavigationMenuItemId();
        if (itemId == currentItemId) {
            if (itemId == R.id.one) {
                
            }
            return false;
        }
        if (itemId == R.id.two) {
            startActivity(new Intent(this,TwoActivity.class));
        } 
        return true;
    }

    private void updateNavigationBarState() {
        int actionId = getNavigationMenuItemId();
        selectBottomNavigationBarItem(actionId);
    }

    void selectBottomNavigationBarItem(int itemId) {
        Menu menu = bottomNavigationView.getMenu();
        for (int i = 0,size = menu.size(); i < size; i++) {
            MenuItem item = menu.getItem(i);
            boolean shouldBeChecked = item.getItemId() == itemId;
            if (shouldBeChecked) {
                item.setChecked(true);
                break;
            }
        }
    }

    protected abstract int getContentViewId();

    protected abstract int getNavigationMenuItemId();

问题是我无法修改BottomNavActivity,我正在研究这个新的MainActivity,我必须扩展BottomNavActivity以进行底部导航。

当我在设置 DataBinding 后在 MainActivity 中调用 super.onCreate() 时,底部导航工作正常,但 Viewpager 不显示。当我在绑定之前设置 onCreate 然后 viewpager 显示底部导航不起作用。 我试图在互联网上寻找替代解决方案,但我找不到任何东西,问题仍然存在。 我知道我正面临这个问题,因为 setContentView 被调用了两次。但我找不到解决办法。

两种可能的解决方案:

  1. 我可以在 MainActivity 上再次设置底部导航侦听器,但这样 BottomNavActivity 就没有意义了。
  2. 或者我可以使用旧的 findViewById 并完全删除数据绑定。

我的问题是在仍然使用数据绑定和使用BottomNavActivity的同时有什么方法可以解决这个问题吗? 任何建议或想法都会有很大帮助,我们将不胜感激。

解决方法

找到解决方案

在 MainActivity 中我先设置了绑定变量,然后我将变量发送到了BottomNavactivity

binding = DataBindingUtil.setContentView(this,R.layout.activity_weather_new)
setDataBinding(binding)
super.onCreate(savedInstanceState)

底部导航活动

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(binding == null){
            setContentView(getContentViewId());
            bottomNavigationView = findViewById(R.id.bottom_nav);
        }else {
            bottomNavigationView = binding.bottomNav;

        }
        bottomNavigationView.setOnNavigationItemSelectedListener(this);
    }
public void setDataBinding(ActivityWeatherNewBinding activityWeatherNewBinding){
        binding = activityWeatherNewBinding;
    }

使用绑定变量获取bottomNav视图,从而防止第二次调用setContentView

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?