解决Android Studio xml 格式化不自动换行的问题

今天把Android Studio 2.3 更新为了3.0 遇到一个蛋疼的问题

如图:

格式化完代码后发现不会自动换行了,看着真心不爽。

后来发现其实是设置问题,如图:

只要把这里打上√就可以了。

在此记录一下,希望可以帮到后面的小伙伴

补充知识:Android实现控件内自动换行(比如LinearLayout内部实现子控件换行 )

一、创建类AntoLineUtil(换行操作主要在这里实现)

package com.inpor.fmctv.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import com.inpor.fmctv.R;

public class AntoLineUtil extends ViewGroup {

  /**
   * 子view左右间距
   */
  private int mHorizontalSpacing;
  /**
   * 子view上下行距离
   */
  private int mVerticalSpacing;

  private Context context;

  public AntoLineUtil(Context context) {
    this(context, null);
    this.context = context;
  }

  public AntoLineUtil(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public AntoLineUtil(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    if (attrs != null) {
      TypedArray array = context.obtainStyledAttributes(attrs,
          R.styleable.AntoLineUtil);

      mHorizontalSpacing = array.getDimensionPixelOffset(
          R.styleable.AntoLineUtil_horizontalSpacing, 0);
      mVerticalSpacing = array.getDimensionPixelOffset(
          R.styleable.AntoLineUtil_verticalSpacing, 0);
      array.recycle();

      if (mHorizontalSpacing < 0) mHorizontalSpacing = 0;
      if (mVerticalSpacing < 0) mVerticalSpacing = 0;
    }
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int width = MeasureSpec.getSize(widthMeasureSpec);
    int count = getChildCount();
    for (int i = 0; i < count; i++) {
      measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec);
    }

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    if (widthMode != MeasureSpec.EXACTLY) {
      widthMeasureSpec = MeasureSpec.makeMeasureSpec(
          getAutoLinefeedWidth(width), widthMode);
    }

    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    if (heightMode != MeasureSpec.EXACTLY) {
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(
          getAutoLinefeedHeight(width), heightMode);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  }

  /**
   * 自动换行 计算需要的宽度
   *
   * @param width 可用宽度
   * @return 需要的宽度
   */
  private int getAutoLinefeedWidth(int width) {
    int totalWidth = getPaddingLeft() + getPaddingRight();

    for (int i = 0; i < getChildCount(); i++) {
      if (i > 0) totalWidth += mHorizontalSpacing;
      View child = getChildAt(i);
      int childWidth = child.getMeasuredWidth();
      totalWidth += childWidth;
      if (totalWidth >= width) {
        totalWidth = width;
        break;
      }
    }

    return totalWidth;
  }

  /**
   * 自动换行 计算需要的高度
   *
   * @param width 可用宽度
   * @return 需要的高度
   */
  private int getAutoLinefeedHeight(int width) {

    //一行最大可用宽度
    int lineWidth = width - getPaddingLeft() - getPaddingRight();
    //剩余可用宽度
    int availableLineWidth = lineWidth;
    //需要的高度
    int totalHeight = getPaddingTop() + getPaddingBottom();
    int lineChildIndex = 0;
    //本行最大高度
    int lineMaxHeight = 0;
    for (int i = 0; i < getChildCount(); i++) {
      View child = getChildAt(i);
      int childWidth = child.getMeasuredWidth();
      int childHeight = child.getMeasuredHeight();
      //这个child需要的宽度 如果不是第一位的 那么需要加上间距
      //这里是用来判断需不需要换行
      int needWidth = i == 0 ? childWidth : (childWidth + mHorizontalSpacing);
      //如果剩余可用宽度小于需要的长度 那么换行
      if (availableLineWidth < needWidth) {
        totalHeight = totalHeight + lineMaxHeight;
        if (i > 0) totalHeight += mVerticalSpacing;
        availableLineWidth = lineWidth;
        lineMaxHeight = 0;
        lineChildIndex = 0;
      }
      //这个child需要的宽度 如果不是第一位的 那么需要加上间距
      int realNeedWidth = lineChildIndex == 0 ? childWidth : (childWidth + mHorizontalSpacing);
      lineMaxHeight = Math.max(childHeight, lineMaxHeight);
      availableLineWidth = availableLineWidth - realNeedWidth;
      lineChildIndex++;
    }

    totalHeight = totalHeight + lineMaxHeight;
    return totalHeight;
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    layout();
  }

  private void layout() {

    int count = getChildCount();
    int childLeft = getPaddingLeft();
    int childTop = getPaddingTop();
    int lineWidth = getMeasuredWidth() - getPaddingRight() - getPaddingLeft();
    int availableLineWidth = lineWidth;
    int lineChildIndex = 0;
    //一行的最大高度
    int lineMaxHeight = 0;
    for (int i = 0; i < count; i++) {

      View child = getChildAt(i);

      int childWidth = child.getMeasuredWidth();
      int childHeight = child.getMeasuredHeight();

      int needWidth = i == 0 ? childWidth : (childWidth + mHorizontalSpacing);

      if (availableLineWidth < needWidth) {
        availableLineWidth = lineWidth;
        childTop += lineMaxHeight;
        if (i > 0) childTop += mVerticalSpacing;
        lineMaxHeight = 0;
        childLeft = getPaddingLeft();
        lineChildIndex = 0;
      }

      int realNeedWidth = lineChildIndex == 0 ? childWidth : (childWidth + mHorizontalSpacing);

      lineMaxHeight = Math.max(lineMaxHeight, childHeight);
      child.layout(childLeft + realNeedWidth - childWidth, childTop, childLeft + realNeedWidth, childTop + childHeight);
      availableLineWidth -= realNeedWidth;
      childLeft += realNeedWidth;
      lineChildIndex++;
    }
  }

  public int getHorizontalSpacing() {
    return mHorizontalSpacing;
  }

  public void setHorizontalSpacing(int horizontalSpacing) {
    mHorizontalSpacing = horizontalSpacing;
  }

  public int getVerticalSpacing() {
    return mVerticalSpacing;
  }

  public void setVerticalSpacing(int verticalSpacing) {
    mVerticalSpacing = verticalSpacing;
  }
}

二、在values中的attrs.xml中添加以下代码(实现子控件的边距):

<declare-styleable name="AntoLineUtil">
    <attr name="horizontalSpacing" format="dimension"/>
    <attr name="verticalSpacing" format="dimension"/>
  </declare-styleable>

三、添加固定的xml布局父控件,事先写好,布局activity_video_preview.xml :

<com.inpor.fmctv.util.AntoLineUtil
    android:id="@+id/camera_group"
    android:layout_width="@dimen/size_dp_630"
    android:layout_height="@dimen/size_dp_138"
    android:layout_marginTop="@dimen/size_dp_18"
    android:orientation="horizontal"
    app:horizontalSpacing="@dimen/size_dp_18"
    app:verticalSpacing="@dimen/size_dp_18">
</com.inpor.fmctv.util.AntoLineUtil>

四、添加固定的xml布局子控件,事先写好,动态添加进去,布局item_camera_info.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/video_preview_item"
  android:layout_width="@dimen/size_dp_198"
  android:layout_height="@dimen/size_dp_60"
  android:orientation="horizontal"
  android:paddingLeft="@dimen/size_dp_18"
  android:paddingRight="@dimen/size_dp_18"
  android:gravity="center_vertical"
  android:background="@color/textcolor_395878">
  <TextView
    android:id="@+id/video_preview_item_tv"
    android:layout_width="@dimen/size_dp_120"
    android:layout_height="wrap_content"
    android:textSize="@dimen/size_sp_24"
    android:textColor="@color/white"/>
  <CheckBox
    android:id="@+id/video_previ"
    android:layout_width="@dimen/size_dp_24"
    android:layout_height="@dimen/size_dp_24"
    android:button="@null"
    android:background="@drawable/radio_button_select_ico" />
</LinearLayout>

五、在其他方法中动态添加子控件:

AntoLineUtil cameraGroup = (AntoLineUitl) findViewById(R.id.camera_group); // 此处是找到父控件LinearLayout
for (int i = 0; i<6; i++) {
 // 用以下方法将layout布局文件换成view
 LayoutInflater inflater = getLayoutInflater();
 View view = inflater.inflate(R.layout.item_camera_info,null);
 TextView textView = view.findViewById(R.id.video_preview_item_tv);
 textView.setText("摄像头"+ (cameraId+1));
 cameraGroup.addView(view);
}

六、效果图:

以上这篇解决Android Studio xml 格式化不自动换行的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android Studio自动排版的两种实现方式

    Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studio中编写界面.xml文件的时候,代码自动化程度不高,缩进什么的都不自动,改个代码都能搞得排版一塌糊涂. 所以我就去网上找了两个自动排版的方法: (1)Ctrl + Alt + L: 但是可能会与QQ的快捷键有冲突, 去在QQ设置里面的热键对应的改掉就没冲突了. (2)还有一个不用记快捷键的好办法:就

  • AndroidStudio代码达到指定字符长度时自动换行实例

    1.设置每行最大字符个数,超过这个数字 将会自动换行 2. Line breaks 选中表示隐藏性保持断行 Ensure right margin is not exceeded 选中表示代码超过标准线 就自动换行 补充知识:Android Studio Error-Gradle: 错误:编码 GBK 的不可映射字符的 产生原因分析:项目太旧导致的 解决方案:对应项目级别build.gradle最下方添加 tasks.withType(JavaCompile) { options.encodin

  • Android Studio实现格式化XML代码顺序

    之前用Eclipse时,格式化XML代码,也会把顺序格式化,这样比较方便,看起来也清晰明了. 比如: 用Eclipse格式化时,会变成: Android Studio解决办法: File > Settings > Code Style > XML > Set from > Predefined Style > Android 勾上 File > Settings > Editor > Formatting > Show "Reforma

  • AndroidStudio 设置格式化断行宽度教程

    1.设置格式化换行的宽度 就是这个线,那条右标准线的位置: Setting–>Editor–>Code Style 默认值是100,按照自己的需要更改. 2.设置格式化的时候自动断行到标准线位置 这样就不用往右拖看代码了: Setting–>Editor–>Code Style–>Java 点击右侧标签Wrapping and Braces下勾选Line breaks和EnSure right margin is not exceeded 补充知识:Android Studi

  • 解决Android Studio xml 格式化不自动换行的问题

    今天把Android Studio 2.3 更新为了3.0 遇到一个蛋疼的问题 如图: 格式化完代码后发现不会自动换行了,看着真心不爽. 后来发现其实是设置问题,如图: 只要把这里打上√就可以了. 在此记录一下,希望可以帮到后面的小伙伴 补充知识:Android实现控件内自动换行(比如LinearLayout内部实现子控件换行 ) 一.创建类AntoLineUtil(换行操作主要在这里实现) package com.inpor.fmctv.util; import android.content

  • 解决Android Studio XML编辑界面不显示下面的Text和Design选项卡

    问题描述: 在XML布局编写中,下方不显示Text和Design选项卡,无法切换编程和界面视图 解决方法: 1.检查右上角有没有这些选项,这几个按钮可以用来切换 2.上述步骤失败,再尝试改一下这个版本 3.上述两种方法都无法调出Text和Design选项卡,可使用下面两个替代方法 (1)快捷键: Alt+shift+左箭头:跳转Text界面 Alt+Shift+右箭头:跳转Design界面 (2)从Design进入XML,可尝试在界面上右击一个控件,用go to xml能不能去往text界面 以

  • 解决Android studio xml界面无法预览问题

    如下图 修改style.xml中的 parent="Theme.AppCompat.Light.DarkActionBar" 改为 parent="Base.Theme.AppCompat.Light.DarkActionBar" <!-- Base application theme. --> <style name="AppTheme" parent="Base.Theme.AppCompat.Light.Dark

  • 解决Android Studio 格式化快捷键和QQ 锁键盘快捷键冲突问题

    今天,简单讲讲android studio格式化的快捷键和qq快捷键之间的冲突的处理. 每次,当我打开QQ使用android studio格式化的快捷键Ctrl + Alt +L时,总是出现QQ 锁键盘的提示,这个冲突之前我是把QQ关掉,然后再格式化代码.可是这样就无法收到QQ的消息,所以在网上查找了资料,终于解决了问题.这里记录一下. 解决办法:去掉QQ里面 锁键盘快捷键 (1) 在QQ底部 点击 系统设置 (2) 选择 热键 -> 点 设置热键 (3) 在热键 里面 看到 锁定QQ Ctrl

  • 解决Android Studio 格式化 Format代码快捷键问题

    之前使用Eclipse来做开发,现在换Android Studio的时候,原来常用的格式化代码快捷键就无法使用了. 解决方案有两个 将Android Studio的快捷键设置为Eclipse版本的,就可以延续原来的使用习惯 Android Studio自身默认的格式化代码快捷键,Windows系统下为Ctrl + Alt +L,Mac下为Option + Cmd + L 注意Android Studio自身默认的快捷键会和QQ的锁定快捷键互相冲突,建议把QQ的快捷键修改为其他的 补充知识:and

  • 解决Android Studio Design界面不显示layout控件的问题

    Android Studio更新到3.1.3后,发现拖到Design中的控件在预览界面中不显示: 解决办法: 在Styles.xml中的parent="..."中的Theme前添加Base <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar&quo

  • 解决Android Studio 代码自动提示突然失效的问题

    昨天代码写的好好的,今天一打开Android Studio 开始写代码,居然没有代码自动提示了,我他妈也是醉了,学个安卓开发真是心累,各种幺蛾子.作为一个老程序员了,遇到这种问题,只能静下心来找问题. 出现原因: 开启了省电模式,导致代码自动提示失效了.如下图: 解决办法: 关闭省电模式,点击Power Save Mode 那一栏,把勾去掉即可.如下图: 补充知识:一步解决android studio中编写xml代码或者Java代码时提示功能失效! 只需简单一步操作: 关闭android stu

  • 完美解决Android Studio集成crashlytics后无法编译的问题

    问题描述: 在用fabric集成后编译出现如下错误, Error:Cause: hostname in certificate didn't match: <maven.fabric.io> != <*.motili.com> OR <*.motili.com> OR <motili.com> build.gradle部分脚本(fabric插件自动生成的): buildscript { repositories { maven { url 'https://

  • 解决android studio 3.0 加载项目过慢问题--maven仓库选择

    今天用android studio 3.0打开项目时发现一直在谷歌的maven仓库加载 卡到这不动了,看了下maven仓库的配置发现: buildscript { repositories { jcenter() maven { url 'https://maven.google.com' name 'Google' } google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0' // NOTE: Do n

随机推荐