วิธีสร้าง EditText ที่มีมุมมน


คำตอบ:


566

มีวิธีที่ง่ายกว่าวิธีที่เขียนโดย CommonsWare เพียงสร้างทรัพยากรที่EditTextสามารถดึงได้ซึ่งระบุวิธีการที่จะดึง

<?xml version="1.0" encoding="utf-8"?>
<!--  res/drawable/rounded_edittext.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
 <solid android:color="#FFFFFF"/>
    <corners
     android:bottomRightRadius="15dp"
     android:bottomLeftRadius="15dp"
  android:topLeftRadius="15dp"
  android:topRightRadius="15dp"/>
</shape>

จากนั้นเพียงอ้างอิง drawable นี้ในเค้าโครงของคุณ:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="5dip"
    android:background="@drawable/rounded_edittext" />
</LinearLayout>

คุณจะได้รับสิ่งที่ชอบ:

ข้อความแสดงแทน

แก้ไข

จากความคิดเห็นของ Mark ฉันต้องการเพิ่มวิธีที่คุณสามารถสร้างสถานะที่แตกต่างกันสำหรับEditText:

<?xml version="1.0" encoding="utf-8"?>
<!-- res/drawable/rounded_edittext_states.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
     android:state_pressed="true" 
     android:state_enabled="true"
        android:drawable="@drawable/rounded_focused" />
    <item 
     android:state_focused="true" 
     android:state_enabled="true"
        android:drawable="@drawable/rounded_focused" />
    <item 
     android:state_enabled="true"
        android:drawable="@drawable/rounded_edittext" />
</selector>

เหล่านี้คือรัฐ:

<?xml version="1.0" encoding="utf-8"?>
<!-- res/drawable/rounded_edittext_focused.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
 <solid android:color="#FFFFFF"/>
 <stroke android:width="2dp" android:color="#FF0000" />
    <corners
     android:bottomRightRadius="15dp"
     android:bottomLeftRadius="15dp"
  android:topLeftRadius="15dp"
  android:topRightRadius="15dp"/>
</shape>

และ ... ตอนนี้EditTextควรมีลักษณะดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    android:background="@drawable/rounded_edittext_states"
    android:padding="5dip"/>
</LinearLayout>

15
ยกเว้นว่าโซลูชันของคุณใช้ drawable เดียวกันสำหรับทุกรัฐ ปกติEditTextมีพื้นหลังที่แตกต่างกันสำหรับการโฟกัสปิดการใช้งานกดและเลือกนอกเหนือจากค่าเริ่มต้น โดยเฉพาะอย่างยิ่งการมุ่งเน้นอาจมีความสำคัญต่อไปถ้าเราได้รับอุปกรณ์ Android บางอย่างที่ไม่มีหน้าจอสัมผัสเช่น Google TV
CommonsWare

มันเยี่ยมมาก! มันทำงานได้ดีบนอุปกรณ์ แต่ป้องกันไม่ให้มุมมอง 'รูปแบบกราฟิก' แสดงกิจกรรมของฉันเมื่อฉันรวมกล่องแก้ไขแบบกลม บันทึกข้อผิดพลาดให้ฉัน 'UnsupportedOperationException: null' ความคิดใด ๆ
Ben Clayton

เป็นการดีที่จะรู้ ... จริง ๆ แล้วฉันไม่ทราบวิธีการแก้ไข ฉันเดาว่านี่เป็นข้อผิดพลาดของ Eclipse ของ ADT
Cristian

คำตอบที่ยอดเยี่ยม เมื่อฉันพยายามที่จะทำกับ ADT ล่าสุดไม่มีอะไรเกิดขึ้น แต่หน้าจอการออกแบบ UI กลายเป็นสีเทา .. น่ารำคาญนิดหน่อย แต่คำตอบที่ยอดเยี่ยม บันทึกฉันจากเจ้านายของฉัน :)
เจยู

2
ถ้ารัศมีของคุณเหมือนกันสำหรับทั้ง 4 มุมใช้android:radiusแทนการกำหนด 4 บรรทัด
Viswanath Lekshmanan

129

นี่คือโซลูชันเดียวกัน (พร้อมรหัสโบนัสพิเศษ) ในไฟล์ XML เพียงไฟล์เดียว:

<?xml version="1.0" encoding="utf-8"?>
<!--  res/drawable/edittext_rounded_corners.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true" android:state_focused="true">
    <shape>
        <solid android:color="#FF8000"/>
        <stroke
            android:width="2.3dp"
            android:color="#FF8000" />
         <corners
            android:radius="15dp" />
    </shape>
</item>

<item android:state_pressed="true" android:state_focused="false">
    <shape>
        <solid android:color="#FF8000"/>
        <stroke
            android:width="2.3dp"
            android:color="#FF8000" />      
        <corners
            android:radius="15dp" />       
    </shape>
</item>

<item android:state_pressed="false" android:state_focused="true">
    <shape>
        <solid android:color="#FFFFFF"/>
        <stroke
            android:width="2.3dp"
            android:color="#FF8000" />  
        <corners
            android:radius="15dp" />                          
    </shape>
</item>

<item android:state_pressed="false" android:state_focused="false">
    <shape>
        <gradient 
            android:startColor="#F2F2F2"
            android:centerColor="#FFFFFF"
            android:endColor="#FFFFFF"
            android:angle="270"
        />
        <stroke
            android:width="0.7dp"                
            android:color="#BDBDBD" /> 
        <corners
            android:radius="15dp" />            
    </shape>
</item>

<item android:state_enabled="true">
    <shape>
        <padding 
                android:left="4dp"
                android:top="4dp"
                android:right="4dp"
                android:bottom="4dp"
            />
    </shape>
</item>

</selector>

จากนั้นคุณเพียงตั้งค่าแอตทริบิวต์พื้นหลังเป็นไฟล์ edittext_rounded_corners.xml:

<EditText  android:id="@+id/editText_name"
      android:background="@drawable/edittext_rounded_corners"/>

ได้รับข้อผิดพลาดเป็น "0.5dp" ในแอตทริบิวต์ "width" ไม่ใช่รูปแบบที่ถูกต้อง
Maveňツ

ฉันพยายามใช้วิธีการแก้ปัญหาข้างต้น แต่น่าเสียดายที่ในขณะที่ฉันตั้งค่าtopRightRadiusและtopLeftRadiusมุมทั้งสี่ก็ถูกปัด กรุณาช่วย. :(
ikartik90

30

ลองอันนี้,

1. สร้างไฟล์ round_edittext.xml ใน Drawable ของคุณ

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" android:padding="15dp">
        <solid android:color="#FFFFFF"/>
        <corners
            android:bottomRightRadius="0dp"
            android:bottomLeftRadius="0dp"
            android:topLeftRadius="0dp"
            android:topRightRadius="0dp"/>
        <stroke android:width="1dip" android:color="#f06060" />
    </shape>

2. ใช้พื้นหลังสำหรับ EditText ของคุณในไฟล์ xml

                <EditText
                android:id="@+id/edit_expiry_date"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dip"
                android:background="@drawable/rounded_edittext"
                android:hint="@string/shop_name"
                android:inputType="text"/>

3. คุณจะได้รับผลลัพธ์เช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่


1
Sachin ภาพที่ส่งออกของคุณแสดงให้เห็นมุมสี่เหลี่ยมจัตุรัสที่ไม่ปัดเศษตามที่ผู้ถามร้องขอ นี่อาจเป็นวิธีที่ดีในการทำให้กล่องมีโครงร่าง
JesseBoyd

2
@JesseBoyd ความกังวลของคุณนั้นถูกต้อง แต่ round_edittext ในไฟล์ xml นี้เพียงแค่เปลี่ยนค่าของรัศมีทั้งหมดตามความต้องการของคุณ
sachin pangare

17

ขอบคุณสำหรับคำตอบของ Norfeldt ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยในการไล่ระดับสีเพื่อให้เกิดเงาภายในที่ดีขึ้น

<item android:state_pressed="false" android:state_focused="false">
    <shape>
        <gradient
            android:centerY="0.2"
            android:startColor="#D3D3D3"
            android:centerColor="#65FFFFFF"
            android:endColor="#00FFFFFF"
            android:angle="270"
            />
        <stroke
            android:width="0.7dp"
            android:color="#BDBDBD" />
        <corners
            android:radius="15dp" />
    </shape>
</item>

ดูดีในรูปแบบพื้นหลังสีอ่อน ..

ป้อนคำอธิบายรูปภาพที่นี่


7

โดยวิธีคิดของฉันมันมีมุมโค้งมนอยู่แล้ว

ในกรณีที่คุณต้องการให้ปัดเศษขึ้นคุณจะต้อง:

  1. โคลนภาพ PNG เก้าแพทช์ทั้งหมดที่ประกอบเป็นEditTextพื้นหลัง (พบใน SDK ของคุณ)
  2. ปรับเปลี่ยนแต่ละมุมให้มีมุมมนมากขึ้น
  3. โคลนStateListDrawableทรัพยากรXML ที่รวมEditTextพื้นหลังเหล่านั้นไว้ในที่เดียวDrawableและปรับเปลี่ยนให้ชี้ไปที่ไฟล์ PNG เก้าแพทช์เพิ่มเติม
  4. ใช้สิ่งใหม่StateListDrawableเป็นพื้นหลังสำหรับEditTextวิดเจ็ตของคุณ

3

หากคุณต้องการมุมที่ควรโค้งไม่จบทั้งหมดใช้รหัสด้านล่าง

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

    <corners android:radius="10dp" />

    <padding
        android:bottom="3dp"
        android:left="0dp"
        android:right="0dp"
        android:top="3dp" />

    <gradient
        android:angle="90"
        android:endColor="@color/White"
        android:startColor="@color/White" />

    <stroke
        android:width="1dp"
        android:color="@color/Gray" />

</shape>

EditTextซึ่งจะโค้งมุมสี่


2

เพียงเพิ่มคำตอบอื่น ๆ ฉันพบว่าวิธีที่ง่ายที่สุดเพื่อให้ได้มุมมนคือการตั้งค่าต่อไปนี้เป็นพื้นหลังของ Edittext ของคุณ

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

    <solid android:color="@android:color/white"/>
    <corners android:radius="8dp"/>

</shape>

2

กับห้องสมุดส่วนประกอบวัสดุคุณสามารถใช้MaterialShapeDrawableในการวาดรูปทรงที่กำหนดเอง

ด้วยEditTextคุณสามารถทำได้:

    <EditText
        android:id="@+id/edittext"
        ../>

จากนั้นสร้างMaterialShapeDrawable:

float radius = getResources().getDimension(R.dimen.default_corner_radius);

EditText editText = findViewById(R.id.edittext);
//Apply the rounded corners 
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
                .toBuilder()
                .setAllCorners(CornerFamily.ROUNDED,radius)
                .build();

MaterialShapeDrawable shapeDrawable = 
            new MaterialShapeDrawable(shapeAppearanceModel);
//Apply a background color
shapeDrawable.setFillColor(ContextCompat.getColorStateList(this,R.color.white));
//Apply a stroke
shapeDrawable.setStroke(2.0f, ContextCompat.getColor(this,R.color.colorAccent));

ViewCompat.setBackground(editText,shapeDrawable);

ป้อนคำอธิบายรูปภาพที่นี่

ต้องการไลบรารีเวอร์ชัน1.1.0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.