【问题标题】:Android LinearLayout doesn't look the same on an actual deviceAndroid LinearLayout 在实际设备上看起来不一样
【发布时间】:2019-04-25 00:29:33
【问题描述】:

我正在为 Android 应用创建自定义数字键盘。为此,我使用了几个水平的LinearLayout

这是与activity的那部分相关的代码:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="67dp">

    <ImageView
        android:id="@+id/digit1"
        android:layout_width="117dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/rsz_untitled_3" />

    <ImageView
        android:id="@+id/digit2"
        android:layout_width="118dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_2" />

    <ImageView
        android:id="@+id/digit3"
        android:layout_width="100dp"
        android:layout_height="67dp"
        android:layout_weight="1"
        app:srcCompat="@drawable/digit_3" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="70dp">

    <ImageView
        android:id="@+id/digit4"
        android:layout_width="117dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_4" />

    <ImageView
        android:id="@+id/digit5"
        android:layout_width="118dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_5" />

    <ImageView
        android:id="@+id/digit6"
        android:layout_width="100dp"
        android:layout_height="67dp"
        android:layout_weight="1"
        app:srcCompat="@drawable/digit_6" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="64dp">

    <ImageView
        android:id="@+id/digit7"
        android:layout_width="117dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_7" />

    <ImageView
        android:id="@+id/digit8"
        android:layout_width="118dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_8" />

    <ImageView
        android:id="@+id/digit9"
        android:layout_width="100dp"
        android:layout_height="67dp"
        android:layout_weight="1"
        app:srcCompat="@drawable/digit_9" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="64dp">

    <ImageView
        android:id="@+id/digitvoid"
        android:layout_width="117dp"
        android:layout_height="67dp" />

    <ImageView
        android:id="@+id/digit0"
        android:layout_width="118dp"
        android:layout_height="67dp"
        app:srcCompat="@drawable/digit_0" />

    <ImageView
        android:id="@+id/digitdelete"
        android:layout_width="100dp"
        android:layout_height="67dp"
        android:layout_weight="1"
        app:srcCompat="@drawable/digit_delete" />

</LinearLayout>

您可以在此处查看 Android 工作室 中的外观,以及实际设备上的外观。我不明白为什么会这样。我正在使用dp(根据我的理解应该是动态像素),所以它们应该在每台设备上都可以很好地缩放。

【问题讨论】:

  • 尝试使用ConstraintLayout你解决这个问题很简单
  • 只给所有 width = 0dp

标签: android android-layout android-linearlayout


【解决方案1】:

您在视图上使用了固定尺寸,因为不同手机的屏幕尺寸不同,这会使您的屏幕无响应。

如果您想使用LinearLayout,您可能需要使用android:layout_weightandroid:weightSum 属性,以便使您的视图相对于您的屏幕具有一定的大小。 您可以这样做,它会起作用,但所有嵌套视图很可能会影响您的布局性能。

如果您想要一个能够响应所有屏幕尺寸的布局,您可以使用ConstraintLayoutchains,这是一个示例:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="1"
    app:layout_constraintBottom_toBottomOf="@+id/button10"
    app:layout_constraintEnd_toStartOf="@+id/button10"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button10" />

<Button
    android:id="@+id/button2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="0"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/button11"
    app:layout_constraintStart_toEndOf="@+id/button5"
    app:layout_constraintTop_toBottomOf="@+id/button4" />

<Button
    android:id="@+id/button11"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="x"
    app:layout_constraintBottom_toBottomOf="@+id/button2"
    app:layout_constraintEnd_toEndOf="@+id/button3"
    app:layout_constraintStart_toEndOf="@+id/button4"
    app:layout_constraintTop_toTopOf="@+id/button2" />

<Button
    android:id="@+id/button3"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="8"
    app:layout_constraintBottom_toBottomOf="@+id/button4"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button4"
    app:layout_constraintTop_toTopOf="@+id/button4" />

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="8"
    app:layout_constraintBottom_toTopOf="@+id/button2"
    app:layout_constraintEnd_toStartOf="@+id/button3"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button5"
    app:layout_constraintTop_toBottomOf="@+id/button7" />

<Button
    android:id="@+id/button5"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="7"
    app:layout_constraintBottom_toBottomOf="@+id/button4"
    app:layout_constraintEnd_toStartOf="@+id/button4"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button4" />

<Button
    android:id="@+id/button6"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="6"
    app:layout_constraintBottom_toBottomOf="@+id/button7"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button7"
    app:layout_constraintTop_toTopOf="@+id/button7" />

<Button
    android:id="@+id/button7"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="5"
    app:layout_constraintBottom_toTopOf="@+id/button4"
    app:layout_constraintEnd_toStartOf="@+id/button6"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button8"
    app:layout_constraintTop_toBottomOf="@+id/button10" />

<Button
    android:id="@+id/button8"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="4"
    app:layout_constraintBottom_toBottomOf="@+id/button7"
    app:layout_constraintEnd_toStartOf="@+id/button7"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/button7" />

<Button
    android:id="@+id/button9"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="3"
    app:layout_constraintBottom_toBottomOf="@+id/button10"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button10"
    app:layout_constraintTop_toTopOf="@+id/button10" />

<Button
    android:id="@+id/button10"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="2"
    app:layout_constraintBottom_toTopOf="@+id/button7"
    app:layout_constraintEnd_toStartOf="@+id/button9"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/button"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_chainStyle="packed" />
 </android.support.constraint.ConstraintLayout>

看起来像这样:

【讨论】:

    【解决方案2】:

    显然你是在第三行这样做的:

    android:layout_weight="1"
    

    这会导致问题 - 如果您的屏幕不够宽,无法遵循您的宽度指令,您会指示所有按钮都不相同,因此只有最后一个按钮应该调整大小。

    【讨论】:

      【解决方案3】:

      这里是你需要让这个东西工作的布局。 dp 被转换为近似大小。但是,如果您想根据屏幕大小调整元素,您可能会考虑一直使用weight

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="67dp"
              android:orientation="horizontal">
      
              <ImageView
                  android:id="@+id/digit1"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/rsz_untitled_3" />
      
              <ImageView
                  android:id="@+id/digit2"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_2" />
      
              <ImageView
                  android:id="@+id/digit3"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_3" />
      
          </LinearLayout>
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="70dp"
              android:orientation="horizontal">
      
              <ImageView
                  android:id="@+id/digit4"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_4" />
      
              <ImageView
                  android:id="@+id/digit5"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_5" />
      
              <ImageView
                  android:id="@+id/digit6"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_6" />
      
          </LinearLayout>
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="64dp"
              android:orientation="horizontal">
      
              <ImageView
                  android:id="@+id/digit7"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_7" />
      
              <ImageView
                  android:id="@+id/digit8"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_8" />
      
              <ImageView
                  android:id="@+id/digit9"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_9" />
      
          </LinearLayout>
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="64dp"
              android:orientation="horizontal">
      
              <ImageView
                  android:id="@+id/digitvoid"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1" />
      
              <ImageView
                  android:id="@+id/digit0"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_0" />
      
              <ImageView
                  android:id="@+id/digitdelete"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  app:srcCompat="@drawable/digit_delete" />
          </LinearLayout>
      </LinearLayout>
      

      【讨论】:

        【解决方案4】:

        请检查以下代码。它可能会解决您的问题。如果您遇到任何问题,请在评论部分告诉我。

        使用您自己的可绘制对象和资产。

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
        
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="67dp">
        
                <ImageView
                    android:id="@+id/digit1"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit2"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit3"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
            </LinearLayout>
        
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="67dp">
        
                <ImageView
                    android:id="@+id/digit4"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit5"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit6"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
            </LinearLayout>
        
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="67dp">
        
                <ImageView
                    android:id="@+id/digit7"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit8"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digit9"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
            </LinearLayout>
        
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="67dp">
        
                <ImageView
                    android:id="@+id/digitvoid"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1" />
        
                <ImageView
                    android:id="@+id/digit0"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
                <ImageView
                    android:id="@+id/digitdelete"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    app:srcCompat="@drawable/add_more_icon" />
        
            </LinearLayout>
        </LinearLayout>
        

        如果它对您有用,请批准答案。谢谢!

        【讨论】:

          【解决方案5】:

          请将您的 4 LinearLayout 替换为:

            <LinearLayout
              android:orientation="horizontal"
              android:weightSum="3"
              android:layout_weight="0.2"
              android:layout_width="match_parent"
              android:layout_height="0dip">
          
              <ImageView
                  android:layout_weight="1"
                  android:id="@+id/digit1"
                  android:layout_width="0dip"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/rsz_untitled_3" />
          
              <ImageView
                  android:id="@+id/digit2"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_2" />
          
              <ImageView
                  android:id="@+id/digit3"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_3" />
          
          </LinearLayout>
          
          <LinearLayout
              android:orientation="horizontal"
              android:weightSum="3"
              android:layout_weight="0.2"
              android:layout_width="match_parent"
              android:layout_height="0dip">
          
              <ImageView
                  android:id="@+id/digit4"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_4" />
          
              <ImageView
                  android:id="@+id/digit5"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_5" />
          
              <ImageView
                  android:id="@+id/digit6"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_6" />
          
          </LinearLayout>
          
          <LinearLayout
              android:orientation="horizontal"
              android:weightSum="3"
              android:layout_weight="0.2"
              android:layout_width="match_parent"
              android:layout_height="0dip">
          
              <ImageView
                  android:id="@+id/digit7"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_7" />
          
              <ImageView
                  android:id="@+id/digit8"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_8" />
          
              <ImageView
                  android:id="@+id/digit9"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_9" />
          
          </LinearLayout>
          
          <LinearLayout
              android:orientation="horizontal"
              android:weightSum="3"
              android:layout_weight="0.2"
              android:layout_width="match_parent"
              android:layout_height="0dip">
          
              <ImageView
                  android:id="@+id/digitvoid"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent" />
          
              <ImageView
                  android:id="@+id/digit0"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_0" />
          
              <ImageView
                  android:id="@+id/digitdelete"
                  android:layout_width="0dip"
                  android:layout_weight="1"
                  android:layout_height="match_parent"
                  app:srcCompat="@drawable/digit_delete" />
          
          </LinearLayout>
          

          并添加父布局这两个属性:

          android:orientation="vertical"
          android:weightSum="1.0"
          

          注意: 如果您想减小正方形的高度,只需将 :android:layout_weight="0.2" 的值减小为 android:layout_weight="0.15"

          【讨论】:

            【解决方案6】:

            试试这个

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
            
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="70dp"
                    android:padding="2dp">
            
                    <ImageView
                        android:id="@+id/digit1"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/rsz_untitled_3" />
            
                    <ImageView
                        android:id="@+id/digit2"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_2" />
            
                    <ImageView
                        android:id="@+id/digit3"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_3" />
            
                </LinearLayout>
            
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="70dp"
                    android:padding="2dp">
            
                    <ImageView
                        android:id="@+id/digit4"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_4" />
            
                    <ImageView
                        android:id="@+id/digit5"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_5" />
            
                    <ImageView
                        android:id="@+id/digit6"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_6" />
            
                </LinearLayout>
            
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="70dp"
                    android:padding="2dp">
            
                    <ImageView
                        android:id="@+id/digit7"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_7" />
            
                    <ImageView
                        android:id="@+id/digit8"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_8" />
            
                    <ImageView
                        android:id="@+id/digit9"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_9" />
            
                </LinearLayout>
            
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="70dp"
                    android:padding="2dp">
            
                    <ImageView
                        android:id="@+id/digitvoid"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_margin="5dp"
                        android:layout_weight="1" />
            
                    <ImageView
                        android:id="@+id/digit0"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_0" />
            
                    <ImageView
                        android:id="@+id/digitdelete"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:layout_margin="5dp"
                        app:srcCompat="@drawable/digit_delete" />
            
                </LinearLayout>
            </LinearLayout>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-11
              • 2014-10-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多