Android侧滑栏DrawerLayout + databinding + 按钮改变颜色

  工作第一个任务,写一个点击按钮和滑动都可以打开的侧滑栏,作为刚刚开始的菜鸟,写篇心得。

首先是在布局方面的坑,按下按钮之后发现没有反应,查询之后现在发现了问题所在是因为按钮所在的子布局中还有按钮,所以子按钮可以点击但是父按钮点击不了。现在还没改,之后再说吧。

然后是侧滑栏的布局,目前直接在mainActivity中写了个左侧滑栏的布局,一堆的菜单和一个退出的按钮,主要是滑动使得界面展示,点击按钮变色,xml布局,读取数据,绑定界面。

在最开始的绑定界面的过程中,不同于以前的findVIewById方法,采用的是viewModel + viewActivity的java代码,通过databinding的方法实现对控件的绑定。因为学到了很多,所以简单记一下怕以后会忘。

首先是侧滑栏的使用,可以参考Android高级UI开发(九)之侧滑菜单 --抽屉_gaoxiaoweiandy的专栏-CSDN博客_android侧滑菜单  

通过在所需要侧滑栏的页面直接创建侧滑栏的.xml布局,需要注意的是侧滑栏并不是一个单独的页面,而是在一个页面中隐藏的页面,滑动之后显示,平时不显示而已。因此不需要单独再创建一个activity,在需要侧滑栏的页面的xml中添加布局就可以。

问题是在这样的情况下会使得页面的xml文件冗长,因为需要在xml对应的java文件中初始化控件,添加<include>拆分页面的方法不太行,还没有想到合适的解决方法。哭哭~可能是因为我在页面开始直接写了DrawerLayout,可能不这样写便于拆分页面吗
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainDrawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/mainToolbar"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

DrawerLayout的优势对我而言是实现的效果可以直接让源页面作为背景不被覆盖,

示例

 这样可以在源页面上显示半个抽屉,不影响源页面的显示,但是需要在定义的抽屉页面中加入

 android:clickable="true"

 否则源页面中的控件还是可以被点击或者滑动,显得很奇怪,

<LinearLayout

    android:layout_width="228dp"
    android:layout_height="fill_parent"
    android:layout_gravity="start"
    android:orientation="vertical"
    android:paddingTop="50dp"
    android:clickable="true"
    android:background="#202020">

另外

android:layout_gravity="start" 是左滑动栏,end是右边,center是中间主页面。

之后我的代码主要是调整布局,新的页面以及页面跳转之类没有技术含量的东西就不说了,有趣的是关于按钮的background的设置,一开始是想让一个控件实现选中改变颜色,找了很多地方,大多数都是设置成按钮<Button>然后定义一个按钮的布局文件.xml在drawable中加入android:state_pressed, android:state_focused之类的东西,但是我发现就算是不可点击的控件中设置了clickable,依然没有选中的功能,只有pressed按下变色。

具体链接:改变android控件颜色_u012422855的专栏-CSDN博客

https://i.csdn.net/#/user-center/collection-list?type=1&folder=7931437&key=1

所以要么将控件直接定义成button,但是我倔强,因此我就想能不能在原有的控件上加一个透明的button,透明的button点击变色不就可以了?

事实证明是可以的,但是一开始我在button上的background设置成了@/null,虽然是透明的,但是没有办法实现我的需求,可能是@/null不能实现点击还是setbackgroundcolor还是什么原因吗我也没研究,换成了

android:background="@color/transparent"

搞定了。。。但是没有完全搞定

按钮需要添加flag来判断当前是选中的还是没有选中的,一个按钮选中了之后要把其他按钮设置回原来的颜色,按钮第二次点击要重置回原来的颜色,我一共就两个按钮,不上不下的也不太想为这两个添加一个list,想了想还是打算换个方法,添加了一个延时,让按钮在0.2秒之类改变颜色,然后恢复透明,由于我改变的只是按钮本身的颜色没有setTextColor,但是我的颜色很深接近黑色,反正0.2秒你能看得清个鬼,效果ok了。

else if (v.equals(aboutUsEnterBtn)) {
    aboutUsEnterBtn.setBackgroundColor(Color.parseColor("#141414"));
    new Thread() {
        @Override
        public void run() {
            super.run();
            try {
                Thread.sleep(200);//休眠0.2秒
                doActivity(AboutUsActivity.class);
                aboutUsEnterBtn.setBackgroundColor(Color.TRANSPARENT);
                baseActivity.finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();

Databinding也简单的说一下,项目的代码将页面的java部分分为model和activity两个部分,在model中要

public MainModel(BaseActivity baseActivity) {
    super(baseActivity);
}
public void setMainBindView(ActivityMainBinding activityMainBinding) {
    this.activityMainBinding = activityMainBinding;

………………………………

………………………………

………………………………

}

然后 在activity中,

public class MainActivity extends BaseActivity {
    private MainDataModel mainDataModel;
    private ActivityMainDataBinding activityMainDataBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityPersonalDataBinding = ActivityPersonalDataBinding.inflate(getLayoutInflater());
        setContentView(activityPersonalDataBinding.getRoot());
        personalDataModel = new PersonalDataModel(this);
        personalDataModel.setActivityPersonalDataBinding(activityPersonalDataBinding);

    }
    public void onDestory() {
        super.finish();;
    }
}

databinding实现之后的按钮基本上都会自动识别,轻轻松松就初始化完成,还是比findItemById感觉上方便很多,当然如果只有一两个控件还是直接findItemById吧,没必要找麻烦炫技。

然后还有一个自动登录的问题,可以参考Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)_lyl953147712的博客-CSDN博客

但是项目的代码是封装了的,直接使用

if (SPUtils.isLogin()) {
    doActivity(MainActivity.class);
    finish();
    return;
}

就直接获取权限跳转页面了,因为我的代码要涉及到退出登录,每次退出之后自动登录搞得我一度以为自己的功能有问题。

else if (v.equals(exitDrawerBtn)) {
    baseActivity.finish();
    mainDrawerLayout.closeDrawer(GravityCompat.START);
    SPUtils.putIsLogin(false);
    doActivity(LoginActivity.class);
}

其实只要调用一下设定false不让它自己自动跳就ok了。

最后是一个svn的问题,因为没有在安装android的时候绑定svn搞得提交代码的时候出错了,尴尬,而且给别人也带来了麻烦,

Android studio使用SVN提交项目代码_龙旋的博客-CSDN博客_android studio svn提交代码

可以参考这个来配置android studio的svn配置,

简单来说要取消勾选下面两个, 在地址栏写自己的svn 的bin的地址,安装svn 的时候要将所有的都勾选上,然后一般来说没什么问题了。

才刚刚开始踏上蛮长的android学习啊。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这三个组件在 Android 开发中经常一起使用。 Fragment 是一种 UI 组件,它可以被添加到 Activity 中,用于显示用户界面。LiveData 是一种持有数据的类,它可以感知数据的变化并将变化推送给注册的观察者。DataBinding 是一种将数据绑定到 UI 上的技术,它可以让你在布局文件中直接使用变量,而无需在代码中手动设置值。 使用 Fragment + LiveData + DataBinding 的一般步骤如下: 1. 创建一个 Fragment 类,并在其中定义 LiveData 对象; 2. 在 Fragment 的布局文件中使用 DataBinding,将 LiveData 对象绑定到 UI 控件上; 3. 在 Fragment 中注册 LiveData 的观察者,并在数据变化时更新 UI。 具体实现可以参考以下代码: ```kotlin class MyFragment : Fragment() { private val data = MutableLiveData<String>() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my, container, false) as FragmentMyBinding binding.lifecycleOwner = this binding.data = data return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) data.observe(viewLifecycleOwner, Observer { newValue -> // 更新 UI }) } } ``` 在这个例子中,我们创建了一个名为 `data` 的 LiveData 对象,并将其绑定到了布局文件中的一个 TextView 控件上。在 `onViewCreated` 方法中,我们注册了 `data` 的观察者,并在数据变化时更新了 UI。注意,我们在 `onCreateView` 方法中使用了 DataBinding,将 `data` 对象传递给了布局文件。这样,我们就可以直接在布局文件中使用 `data` 变量来显示数据了。 ### 回答2: Fragment(片段)是一种在Android中用于构建用户界面的组件。它可以作为Activity的一部分存在,在Activity内部承载和管理界面。Fragment具有自己的生命周期,可以接收用户交互事件,并有自己的布局文件和逻辑代码。Fragment可以实现模块化开发,将复杂的界面逻辑拆分成多个Fragment,提高代码的可维护性和复用性。 LiveData(生命周期感知的可观察数据对象)是一种设计用于在应用程序组件之间共享数据的类。LiveData具有生命周期感知能力,能够根据组件的生命周期自动触发数据变化通知。LiveData可以感知Activity、Fragment等组件的生命周期状态,并在活跃状态下向观察者发送数据更新,确保数据的及时更新和有效传递。LiveData还支持线程切换,可以使用主线程观察数据变化,避免在后台线程操作UI。 DataBinding(数据绑定)是一种使数据与界面进行自动绑定的技术。通过在布局文件中添加特定的标记和表达式,可以直接将界面上的控件与数据源进行绑定,避免了传统的findViewById和手动设置数据的过程。DataBinding能实现双向绑定,当数据源发生变化时,界面可以自动更新;用户输入变化时,数据源也能自动更新。使用DataBinding可以减少代码量,提高开发效率,同时还提供了一套简单易用的API,方便实现复杂的界面逻辑。 ### 回答3: Fragment、LiveDataDataBindingAndroid开发中常用的三个组件。 Fragment可以理解为Activity中的小片段,它具有自己的布局和生命周期,并且可以嵌入到Activity中。通常情况下,一个Activity可以包含多个Fragment,这样可以使得界面更加模块化、灵活性更高。通过使用Fragment,可以实现页面的动态替换,实现灵活的界面切换。 LiveData是一种具有生命周期感知能力的数据持有者,它可以感知Activity或Fragment的生命周期并自动进行数据的更新,从而能够确保数据和UI之间的同步。LiveData具有以下几个优点:一是能够减少内存泄漏的风险,因为它会自动根据生命周期进行数据的清理;二是能够确保数据的一致性,LiveData在数据发生变化时会自动通知观察者更新UI;三是能够避免不必要的UI更新,LiveData会判断是否有活跃的观察者,从而避免了不必要的数据更新。 DataBinding是一种用于实现数据驱动UI的技术,它能够将布局和数据进行绑定,使得数据的更新能够自动反映到UI上。通过使用DataBinding,可以大大简化UI更新的代码,提高开发效率。它有以下几个特点:一是能够自动生成大量的样板代码,减少手动编写findViewById和setText等操作;二是能够自动处理数据和UI的同步,当数据发生变化时,UI会自动更新;三是能够提高代码的可读性,因为数据的绑定操作是在布局文件中完成的,能够更加清晰地展示UI和数据之间的关系。 综上所述,Fragment、LiveDataDataBindingAndroid开发中非常重要的组件,它们分别负责页面的模块化、数据的同步更新和数据驱动UI,通过合理地使用它们可以提高开发效率、降低内存泄漏风险,从而提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值