Android开发之design库学习

2023-05-16

Internal

ForegroundLinearLayout

分割线性能优化

接触第一个类就是他了,瞬间get到一点关于性能优化的,LinearLayout的divider相关属性,平时开发需要分割线个人表示很多情况下都是下面这样操作的

 <View
     android:layout_width="match_parent"
     android:layout_height="1dp"
     android:background="#ffffff"
     />

以上方案对性能上是有影响的,最优解决方案利用divider属性和Layout的showDividers,xml设置了shape类型的divider,showDividers控制显示分割线,这里必须的提一点关于size的设定,Layout方向水平和垂直定义shape的size是不同的

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <!--<size android:height="2dp"/> layout垂直采用,下面是水平分割线采用-->
    <size  android:width="2dp"/>
</shape>

showDividers属性可选值相关含义如下:

android:showDividers = "middle|end|beginning|none"

middle 在每一项中间添加分割线

end 在最后一项添加分割线

beginning 在最上方添加分割线

none

以上方法基于Android3.0+,向下兼容采用LinearLayoutCompat,下面是实现的相关效果图

Foreground相关扩展控件

ForegroundLinearLayout 、ForegroundImageView、ForegroundRelativeLayout等相关的扩展控件,这类控件作用在你触摸控件显示前景色,实现原理相信随便找个扩展类查看源码你也能看懂,foreground属性配合TintMode使用会有意想不到的效果。下面推荐一片优质的blog关于Foreground的

http://blog.csdn.net/zhuoxiuwu/article/details/50976145

Navigation系列

Navigation系列本之前已经撸过了,再次看过源码相关,发现了本质RecyclerView,具体实现可以自行参考源码这里不过多解释,下面是相关的UML和曾经的学习链接相关的blog(NavigationMenuView extends RecyclerView)

http://blog.csdn.net/lmj623565791/article/details/46405409

http://www.cnblogs.com/JohnTsai/p/5172056.html


widget

Utils相关工具包

AnimationUtils

该类定义了几个静态的差之器,并提供方法计算插值以及一个动画监听器实现类

class AnimationUtils {

    static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
    static final Interpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator();
    static final Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new FastOutLinearInInterpolator();
    static final Interpolator LINEAR_OUT_SLOW_IN_INTERPOLATOR = new LinearOutSlowInInterpolator();
    static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();

 static int lerp()...

 static class AnimationListenerAdapter im...

}

DrawableUtils

每个 Drawable 都关联一个 ConstantState ,这是为了保存 Drawable 类对象的一些恒定不变的数据,如果从同一个 res 中创建的 Drawable 类对象,为了节约内存,它们会共享同一个 ConstantState 类对象。ConstantState可以动态设置,DrawableUtils提供兼容方案,在api 7和api 9采用了不同的方案处理,api9通过反射的方式调用方法而api7则采用反射调用变量赋值的方案。


class DrawableUtils {

    private static Method sSetConstantStateMethod;
    private static Field sDrawableContainerStateField;

    private DrawableUtils() {}

    static boolean setContainerConstantState(DrawableContainer drawable,
            Drawable.ConstantState constantState) {
        if (Build.VERSION.SDK_INT >= 9) {
            // We can use getDeclaredMethod() on v9+
            return setContainerConstantStateV9(drawable, constantState);
        } else {
            // Else we'll just have to set the field directly
            return setContainerConstantStateV7(drawable, constantState);
        }
    }

    private static boolean setContainerConstantStateV9(DrawableContainer drawable,
            Drawable.ConstantState constantState) {

                sSetConstantStateMethod = DrawableContainer.class.getDeclaredMethod(
                        "setConstantState", DrawableContainer.DrawableContainerState.class);

                sSetConstantStateMethod.invoke(drawable, constantState);
                //.................略过众多代码.....................
    }

    private static boolean setContainerConstantStateV7(DrawableContainer drawable,
            Drawable.ConstantState constantState) {

                sDrawableContainerStateField.set(drawable, constantState);
              //.................略过众多代码.....................
    }

}

ThemeUtils

使用design这个库就必须使用Theme.AppCompat theme相关主题,design的自定义控件会有主题的检测如果发现没有使用Theme.AppCompat 相关主题就会抛出异常。


class ThemeUtils {

    private static final int[] APPCOMPAT_CHECK_ATTRS = { R.attr.colorPrimary };

    static void checkAppCompatTheme(Context context) {
        TypedArray a = context.obtainStyledAttributes(APPCOMPAT_CHECK_ATTRS);
        final boolean failed = !a.hasValue(0);
        if (a != null) {
            a.recycle();
        }
        if (failed) {
            throw new IllegalArgumentException("You need to use a Theme.AppCompat theme "
                    + "(or descendant) with the design library.");
        }
    }
}

ViewUtils、ViewUtilsLollipop

这两个类主要是关于视图裁剪相关的代码封装,兼容不同的版本,高版本则需要视图裁剪,ViewUtilsLollipop调用默认的Rect裁剪,由于个人主观因素不想过多理解裁剪视图这块知识,这里仅提供学习链接:

http://www.open-open.com/lib/view/open1416664217867.html

MathUtils

MathUtils仅提供两个方法都是用于限定值,传入值必须在有效范围内如果超出最大值或最小值就按照最大最小值取。比如在开发中根据滑动距离判断计算有效滑动范围等都会有用到。


class MathUtils {

    static int constrain(int amount, int low, int high) {
        return amount < low ? low : (amount > high ? high : amount);
    }

    static float constrain(float amount, float low, float high) {
        return amount < low ? low : (amount > high ? high : amount);
    }

}

ViewGroupUtilsHoneycomb

这是一个关于ViewGroup相关类使用的,用于子View的偏移范围Matrix变换相关的,主要就两个方法

这里恶补个人基础知识点:

/**
 *src矩阵复制到这个矩阵。如果src是null,重置矩阵单位矩阵。
 **
 Matrix{
  public void set(Matrix src) {
        if (src == null) {
            reset();
        } else {
            native_set(native_instance, src.native_instance);
        }
    }
  }

ThreadLocal 资料 :

http://www.cnblogs.com/dolphin0520/p/3920407.html

http://justsee.iteye.com/blog/791919


Dialog扩展

弹出视图窗口有Dialog、AlertDialog、PopupWindow等,后来出了DialogFragment可以更好地管理生命周期,有了Design之后,他们也开始渐入开发者视线:

  • AppCompatDialogFragment

  • BottomSheetDialogFragment

  • BottomSheetDialog

个人认为你只要有学习能力随便看看就可以玩转上面这三个类,so 用法实例就不贴,就贴一个BottomSheetDialog 的运行效果图吧(不要关注图的内容,看效果,注重内涵,我理解的touch就是摸一摸那么一回事儿)

BottomSheetDialog的核心在BottomSheetBehavior,这块涉及到的知识会在后面详细说明。这里就略过了。


Coordinator相关类

CoordinatorLayout相关源码理解请参考下面链接(个人只明白个大概,写不出什么,还是参考已有blog比较好)

Insets相关类以及它关联接口OnApplyWindowInsetsListener的相关理解,请参考下面链接

http://www.jianshu.com/p/aca4fd6743b1

在理解CoordinatorLayout源码时,你不得不了解的知识NestedScroll相关的,可以参考我以前的一篇blog关于这块的知识

http://blog.csdn.net/analyzesystem/article/details/51122653

当你了解了NestedScroll知识后需要先看Behavior的知识,下面提供个人认为写的比较清晰明了的一篇blog

http://blog.csdn.net/huachao1001/article/details/51554608

关于以上知识的一个实战小Case可以参考下面链接

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0818/3315.html

http://www.open-open.com/lib/view/open1437312265428.html

CoordinatorLayout还提供了setStatusBar相关方法,开发如果有需要可以直接调用。CoordinatorLayout涵盖的知识比较多,在后续会单独一篇blog再来实战CoordinatorLayout。

Behavior相关类(自定义Behavior可以参考学习)

BottomSheetBehavior、SwipeDismissBehavior、ViewOffsetBehavior、

HeaderScrollingViewBehavior、HeaderBehavior、ViewOffsetHelper

关于BottomSheetBehavior使用遇到的坑以及相关实现原理参考下面链接

http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2016/0228/4009.html


Snack相关

design库的SnackBar与我之前看过的开源库的SnackBar不同,以前那个是Dialog直接弹出,这这个SnackBar有用到Behavior相关知识,采用Handler通信控制View的动画效果。先看图

SnackBar的视图就是一个自定义的SnackBarLayout(只有两个控件TextView和Button),Duration注解的是时长,Behavior修改的onInterceptTouchEvent拦截,发消息处理hideView.

   static {
        sHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                switch (message.what) {
                    case MSG_SHOW:
                        ((Snackbar) message.obj).showView();
                        return true;
                    case MSG_DISMISS:
                        ((Snackbar) message.obj).hideView(message.arg1);
                        return true;
                }
                return false;
            }
        });
    }

动画控制的核心在这里

根据不同版本选择 ViewCompat.setTranslationY或loadAnimation Res下预定义好的动画。


FloatingActionButtonImpl 相关类

从上图可以看出,FloatingActionButtonImpl 类牵扯甚广,本人表示只用过FloatingActionButton

ShadowViewDelegate

阴影View视图代理接口定义

interface ShadowViewDelegate {
    float getRadius();
    void setShadowPadding(int left, int top, int right, int bottom);
    void setBackgroundDrawable(Drawable background);
    boolean isCompatPaddingEnabled();
}

CircularBorderDrawable、CircularBorderDrawableLollipop

小表瞌睡来了,就写得草一点了,上面两个类是关于圆形边框绘制的,通过画笔配置LinearGradient(shader),调用drawOval方法绘制。下面是一些方法(见名知其意)

VisibilityAwareImageButton、 FloatingActionButton

根据继承关系来看都是ImageButton,这里只需要关注核心类fab,先看构造函数了解我们布局能用到的自定义属性(检查Theme主题看到了吧)

 public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        ThemeUtils.checkAppCompatTheme(context);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.FloatingActionButton, defStyleAttr,
                R.style.Widget_Design_FloatingActionButton);
        mBackgroundTint = a.getColorStateList(R.styleable.FloatingActionButton_backgroundTint);
        mBackgroundTintMode = parseTintMode(a.getInt(
                R.styleable.FloatingActionButton_backgroundTintMode, -1), null);
        mRippleColor = a.getColor(R.styleable.FloatingActionButton_rippleColor, 0);
        mSize = a.getInt(R.styleable.FloatingActionButton_fabSize, SIZE_NORMAL);
        mBorderWidth = a.getDimensionPixelSize(R.styleable.FloatingActionButton_borderWidth, 0);
        final float elevation = a.getDimension(R.styleable.FloatingActionButton_elevation, 0f);
        final float pressedTranslationZ = a.getDimension(
                R.styleable.FloatingActionButton_pressedTranslationZ, 0f);
        mCompatPadding = a.getBoolean(R.styleable.FloatingActionButton_useCompatPadding, false);
        a.recycle();

        mImageHelper = new AppCompatImageHelper(this, AppCompatDrawableManager.get());
        mImageHelper.loadFromAttributes(attrs, defStyleAttr);

        final int maxImageSize = (int) getResources().getDimension(R.dimen.design_fab_image_size);
        mImagePadding = (getSizeDimension() - maxImageSize) / 2;

        getImpl().setBackgroundDrawable(mBackgroundTint, mBackgroundTintMode,
                mRippleColor, mBorderWidth);
        getImpl().setElevation(elevation);
        getImpl().setPressedTranslationZ(pressedTranslationZ);
        getImpl().updatePadding();
    }

以上类容涉及到的自定义属性无需记忆,需要用是直接参考构造函数,代码调用直接参考类的set get方法即可。

在这个类很多地方都可以看到getImpl方法,这是一个根据版本选择不同的实现,阴影的绘制就在这里传入阴影绘制代理实现类。

  private FloatingActionButtonImpl createImpl() {
        final int sdk = Build.VERSION.SDK_INT;
        if (sdk >= 21) {
            return new FloatingActionButtonLollipop(this, new ShadowDelegateImpl());
        } else if (sdk >= 14) {
            return new FloatingActionButtonIcs(this, new ShadowDelegateImpl());
        } else {
            return new FloatingActionButtonEclairMr1(this, new ShadowDelegateImpl());
        }
    }

fab的visibility发生变化时会通过OnVisibilityChangedListener接口定义的show hide方法会调到具体的子类的show hide方法


    private void show(OnVisibilityChangedListener listener, boolean fromUser) {
        getImpl().show(wrapOnVisibilityChangedListener(listener), fromUser);
    }

show hide主要是缩放透明的变化,animation采用的方式不同而已。


一些关系不浅的自定义控件

AppBarLayout与CollapsingToolbarLayout

这里先不具体理解,同样待后续blog再来实战了解源码,这里仅提供blog学习链接几篇(个人在学一个开源的库 Android-ObservableScrollView可以实现这些类似效果,时间预估在学完这个开源库再来看design这方面源码,再加上前端和MPAndroidChart学习,估计这下篇得等一段时间了)

http://www.tuicool.com/articles/j2yAbqR

http://www.open-open.com/lib/view/open1445087021700.html

http://blog.csdn.net/feiduclear_up/article/details/46514791

http://www.ithao123.cn/content-10399248.html

http://www.open-open.com/lib/view/open1438265746378.html

TextInputLayout 和TextInputEditText使用

如果你没了解过可以参考下面链接(表示很久前写过一篇blog学过了,不想过度理解,个人感觉:这玩意在实际项目开发中用处不大,基本国内的app很少这样设计,我们了解就行了)

http://blog.csdn.net/u014733374/article/details/46878839

http://www.jianshu.com/p/0f6575472cb6

TabLayout

我们首先需要了解它的自定义控件的属性相关

tabIndicatorHeight  //滑条指示器的高度

tabIndicatorColor  //滑条指示器的颜色

tabPadding         //tab之间的pading值

tabPaddingStart    //tab左侧的pading值

tabPaddingTop      //tab顶部的pading值

tabPaddingEnd      //tab右侧pading值

tabPaddingBottom   //tab底部的pading值

tabTextAppearance  //可以配置TextAppearance(TabTextSize 、TabTextColor)

tabTextColor       //tab的文字颜色

tabSelectedTextColor //tab选中时的文字

tabMinWidth        //tab的 最小宽度

tabMaxWidth        //tab的 最大宽度

tabBackground      //tab的 背景

tabContentStart    //tab滚动视图与左侧空位位置距离(填充视图)

tabGravity         //tab的填充对齐方式 center fill(一般用这个默认的就好)

tabMode            //tab的模式 fixed(固定) scrollable(可以左右滑动)

xml布局引入TabLayout(xmlns:design=”http://schemas.android.com/apk/res-auto”这句必不可少)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:design="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#efefee"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context="idea.analyzesystem.ui.tablayout.MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout_first"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        design:tabIndicatorHeight="2dp"
        design:tabIndicatorColor="#fff"
        android:background="@color/colorPrimary"
        design:tabPadding="5dp"
        design:tabMinWidth="40dp"
        design:tabMaxWidth="100dp"
        design:tabGravity="fill"
        design:tabSelectedTextColor="#ffffff"
        design:tabTextColor="#f1f1f1"
        design:tabMode="scrollable"
        design:tabContentStart="40dp"
        />

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#DDDDDD"/>
</LinearLayout>

代码中初始化TabLayout布局,默认选中第一个Tab

 protected void initialTabLayout() {
        for (int i = 0; i < tabValues.length; i++) {
            mTabLayout.addTab(mTabLayout.newTab().setText(tabValues[i]), i == 0 ? true : false);
        }
    }

当然,添加tab的方式还可以用xml布局引用

   //**********************此处略************************
       <android.support.design.widget.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="首页"
            android:icon="@null"
            />
        <android.support.design.widget.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="首页"
            android:icon="@null"
            />
        </android.support.design.widget.TabLayout>

根据源码内部链接,可以到http://www.google.com/design/spec/components/tabs.html#tabs-usage这里去了解TabLayout相关效果和开发注意事项,这里略过。tablLayout内部隐藏方法注解Mode,对应值与自定义属性tabMode相对应,默认固定模式,当我们需要动态改变调用setTabMode(int mode)

  public void setTabMode(@Mode int mode) {
        if (mode != mMode) {
            mMode = mode;
            applyModeAndGravity();
        }
    }

如果需要与ViewPager连动调用下面这个方法就可以了

 public void setupWithViewPager(@Nullable final ViewPager viewPager) {}

需要修改选中tab下面的指示器颜色调用

public void setSelectedTabIndicatorColor(@ColorInt int color) {
        mTabStrip.setSelectedIndicatorColor(color);
    }

在这之前也写过类似TabLayout控件的开源库分析:FlycoTabLayout、 PagerSlidingTabStrip


小结

多看源码总会有些许的意外收获,当然也许你会说“我看不懂”,我只能告诉你不要太在意细节,不必一字一句去读懂,了解源码的大致工作流程,学习源代码编码风格和代码设计,这将对自己是一个提升捷径。

最近要忙了,MPAndroidChart开源库的源码理解实战目前进度缓慢,前端学习进度缓慢,本篇的续篇待产,草稿箱的半成品堆积..

小逗逼在这里说一件重要事:周末所有私信都不回复啊,周末休息不谈码,对于某某些人还请见谅!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发之design库学习 的相关文章

  • 删除单向链表中的某一个节点

    已知一个单向链表的表头head xff0c 写出一个删除某一个节点的算法 xff0c 要求先找到此节点 xff0c 然后删除 include lt iostream gt using namespace std typedef struct
  • 多段图的最短路径问题-----动态规划法

    对多段图 xff0c 求最短路径 xff0c 如图 xff1a 对其使用动态规划法 xff1a 阶段 xff1a 将图中的顶点划分5个阶段 xff0c k 状态 xff1a 每个阶段有几种供选择的点s 决策 xff1a 当前状态应在前一个状
  • Android 文件存储 和 权限管理

    转载请标明出处 xff1a xff1a http blog csdn net huaiyiheyuan article details 52473984 android SD卡主要有两种存储方式 Internal External Stor
  • Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件

    Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件 记录一些用于连接linux获取远端文件或者上传文件的小工具 xff0c 另外还有执行shell命令和查找linux目录下文件是否存在 span class toke
  • 【学习整理】Windows server 2019AD域之创建用户的三种形式

    内置工具程序csvde exe xff0c ldifde exe dsadd exe csvde exe xff1a 能利用它来新建用户账户 xff0c 但不能修改 需要将用户数据输入纯文本文件中ldifde exe xff1a 可以利用它
  • 邮件退信提示

    一般情况下 xff0c 当您发送的邮件无法正常到达收件人时 xff0c winmail 邮件系统将会自动给您发一封系统退信 xff0c 这封退信通知里面包含了无法正常发送到对方邮件地址的原因 xff0c 所以绝大多数情况下可以通过退信通知来
  • 学以致用--注解加反射实现Butterknife的View注入功能

    不知不觉更文挑战来到了第三天 xff0c 今天来写一篇反射和注解的应用篇 对反射不熟悉的同学 xff0c 请阅读 搞懂Java反射和JDK里的动态代理 对注解不熟悉的同学 xff0c 请阅读 搞懂Java高级特性 注解 首先这篇文章 xff
  • 百度试题---开发测试工程师

    一 问答题 说出常用的几种希哈函数 xff0c 其作用是什么 xff1f 描述OSI 的七层网络结构 xff0c HTTP 工作在哪一层 xff1f 描述一段C 语言代码程序能运行起来的代码要求和执行过程 二 算法设计 有一车苹果 xff0
  • 错误: Entry在LinkedHashMap中不是公共的; 无法从外部程序包中对其进行访问

    遇到了一个很奇怪的问题 xff0c 使用LinkedHashMap来做LRU缓存时 xff0c 重写protected boolean removeEldestEntry Entry lt String String gt eldest 方
  • 【安卓真机调试】较全面的Android真机调试详解

    目录 1 启动调试功能1 1 配置设备上的开发者选项1 2 运行可调试的 build 变体 2 开始调试2 1 设置断点2 2 选择设备2 3 在工具栏中点击Debug图标2 4 打开Debug窗口2 5 将调试程序连接到正在运行的应用上
  • 如何搭建ftp服务器实现文件共享

    这里以windows系统和linux系统为例 xff0c 简单介绍一下如何在这2种系统下搭建ftp服务器 xff0c 整个过程非常简单 xff0c 感兴趣的朋友可以自己尝试一下 xff1a windows windows系统自带有ftp服务
  • Rabbitmq—— 从入门到放弃

    文章目录 背景总体架构类与方法BlockingConnection init channel BlockingChannelqueue declarequeue deleteexchange declarebasic publishbasi
  • 使用electron-vue+go写一个处理excel表格小软件(2)

    目录 问题思路go部分主要流程遇到的坑 node部分主要流程遇到的坑 源码链接 问题 使用node xlsx处理excel一次最多能处理30M的文件 xff0c 所以来个80M的话就要手动拆成3个文件 xff0c 这看起来太蠢了 xff0c
  • Gradle project sync failed的解决方法

    开发工具android studio在运行项目的时候报如下错误 xff1a Error Gradle project sync failed Please fix your project and try again 编辑gradle wr
  • Mvp契约类实践

    MVP中关于契约的用法 契约类的好处 xff1a 低耦合 接口统一管理 业务逻辑清晰 易于后期维护 以最简单的登录为例 xff1a loginContract契约类 span class token comment 契约类 span spa
  • Ubuntu Wine deepin-Wechat生成方法

    转自https ywnz com linuxjc 5530 html 更新deepin中微信的方法 1 下载官方打包的xxx deb xff0c 放至 xff5e wine app文件夹中 2 创建文件夹extract xff0c 并在ex
  • 借助Redis Bitmap实现简单的布隆过滤器

    在之前的一篇文章中 xff0c 我们已经深入理解了布隆过滤器的基本原理 xff0c 并且了解到它在缓存系统中有较多的应用 Redis提供的Bitmap正好能够作为布隆过滤器所需要的位数组的基础 xff0c 本文先简要介绍Bitmap xff
  • AndroidStudio编写编译脚本Gradle文件时没有,没有代码提示,ctrl + 点击属性时提示Cannot find declaration to go to

    问题描述 AndroidStudio编写编译脚本Gradle文件时没有 xff0c 没有代码提示 xff0c ctrl 43 点击属性时提示Cannot find declaration to go to 原因分析 xff1a gradle
  • 在Ubuntu下最靠谱的键位修改方法 ,亲测有效

    本人刚入坑linux不久 我一直在windows下工作 同样linux我也当成windows来玩 也常有改键位的需求 我曾经百度无数改键位的方法 要么就是只能改左边的ctrol和大小写键交换 右边的alt和ctrol交换失败 有的教程能交换
  • svn怎么切换分支

    项目场景 xff1a svn切换不成功 问题描述 怎么切换都不成功 原因分析 xff1a 解决方案 xff1a 1查看当前所在的位置 2点击switch 3to path选中需要的路径 xff0c ok就可以了 重复1步骤就能查看当前路径是

随机推荐

  • android studio识别不到夜神模拟器怎么办

    问题描述 xff1a 正常运行情况下 xff0c 夜神模拟器突然找不到了 xff1b 解决方案 xff1a 1 找到夜神模拟器的目录bin目录下 xff0c 路径栏中输入cmd回车 xff0c 进入控制台页面 2 执行命令 nox adb
  • Android 动态设置padding跟margin的问题

    padding view setPadding int left int top int right int bottom margin LayoutParams lp 61 LayoutParams view getLayoutParam
  • svn如何合并代码

    1 先提交本地代码 2 切换至要汇总代码的目标枝干 3 在目标枝干选择最外层的文件夹 xff0c 然后右击文件夹 merge 4 选择需要合并的分支 xff0c 和需要合并的日志 xff1b 5可以先test merge xff0c 然后选
  • android studio logcat 无日志 No connect devices

    解决 xff1a 去sdk tools中找到 google use driver xff0c 下载 xff0c 然后重启编译器 成功 连接不上夜神模拟器可以去夜神对应的bin目录下 xff0c 在目录框中输入cmd回车 输入nox adb
  • android findviewbyid 返回null

    findViewById返回Null 转自 xff1a http blog sina com cn s blog 5e58565701012q2d html 错误 xff1a findViewById返回Null xff0c 报nullpo
  • nox夜神模拟器连接不上android studio,用bat脚本快速输入命令

    不知道为什么android studio老是会识别不到夜神模拟器 xff1b 之前都是通过cmd 到夜神的bin目录下面 然后输入命令 xff0c 连接模拟器 现在发现一种更简单的做法 xff1b 1 创建一个文本文档 xff0c 改名的时
  • 微策略2017年秋招线下笔试+技术面+在线测评+主管面总结

    1 前言 微策略可能在国内的知名度比较小 xff0c 它是一家总部在美国 xff0c 在杭州设立研发中心 xff0c 主要做智能商用软件的外企 更多的信息 xff0c 请自行搜索 我是17年10月份面试微策略 xff0c 然后拿到的开发 x
  • Gradle Wrapper是什么

    Gradle提供了内置的Wrapper task帮助我们自动生成Wrapper所需要的目录文件 在一个项目中的根目录下执行 gradle wrapper即可生成 工程结构介绍 xff1a gradlew xff1a Linux下的可执行脚本
  • nginx上传文件失败,提示上传文件过大,怎么解决

    问题描述 xff1a 上传文件失败 xff0c 文件大小4M左右 上传程序为Java xff0c 通过nginx反向代理写入Fastdfs中 xff0c 但是一直失败 xff0c 查看nginx错误日志 xff0c 提示如下内容 xff1a
  • slf4j,log4j,logback之间的关系

    1 SLF4J Simple logging Facade for Java 意思为简单日志门面 xff0c 它是把不同的日志系统的实现进行了具体的抽象化 xff0c 只提供了统一的日志使用接口 xff0c 使用时只需要按照其提供的接口方法
  • 360笔试题2013

    编程题 传教士人数M xff0c 野人C xff0c M C xff0c 开始都在岸左边 xff0c 船只能载两人 xff0c 传教士和野人都会划船 xff0c 当然必须有人划船 两岸边保证野人人数不能大于传教士人数 把所有人都送过河 xf
  • 搜狗笔试题

    搜狗 xff1a 1 xff0c 有n n个正方形格子 xff0c 每个格子里有正数或者0 xff0c 从最左上角往最右下角走 xff0c 只能向下和向右走 一共走两次 xff0c 把所有经过的格子的数加起来 xff0c 求最大值 且两次如
  • WINDOWS VISTA 使用心得(二)

    WINDOWS VISTA 使用心得 xff08 二 xff09 前面谈了VISTA的版本介绍 xff0c 下面谈谈VISTA的安装 现在网上关于VISTA的文章已经很多了 xff0c 介绍也都很详细 我主要是谈谈自己安装VISTA的感受
  • 数据结构-----约瑟夫环问题

    据说著名犹太历史学家 Josephus有过以下的故事 xff1a 在罗马人占领乔塔帕特后 xff0c 39 个犹太人与Josephus及他的朋友躲到一个洞中 xff0c 39个犹太人决定宁愿死也不要被敌人抓到 xff0c 于是决定了一个自杀
  • Ubuntu错误之runitgit-daemon-runE

    使用apt install命令的错误信息如下所示 Use 39 apt get autoremove 39 to remove them 0 upgraded 0 newly installed 0 to remove and 228 no
  • E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)。

    提示 xff1a img alt src https img blog csdnimg cn 00ad6aa76f7b4b3083f5fd9dc0c5f826 png 问题描述 安装包缺少依赖关系时 xff0c 系统提示 您也许需要运行 a
  • Android7.0高级设置修改一级菜单分类和显示顺序并跳转第三方应用

    在android 盒子定制开发中 xff0c 时常会遇到需要修改高级设置Settings内容的需求 xff0c 比如在海思3798MV200方案中 xff0c 显示 菜单和 高级设置 菜单都是调整HDMI视频显示相关的设置 xff0c 但
  • Python 绘制散点图

    span class token keyword from span sklearn span class token punctuation span cluster span class token keyword import spa
  • springMVC之配置(context:component-scan) 详解

    lt context component scan base package 61 34 com wjx betalot 34 lt 扫描的基本包路径 gt annotation config 61 34 true 34 lt 是否激活属性
  • Android开发之design库学习

    Internal ForegroundLinearLayout 分割线性能优化 接触第一个类就是他了 xff0c 瞬间get到一点关于性能优化的 xff0c LinearLayout的divider相关属性 xff0c 平时开发需要分割线个