Thursday, December 5, 2019

Edit Text circular in Android

Here are XML // style works on 28 API onwards
<?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="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="@android:color/white">

    <!-- Mobile number -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:layout_width="match_parent"
            android:layout_height="52dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/bg_rounded_input_field" />

        <TextView
            android:id="@+id/text_dummy_hint_mobile_number"
            android:layout_width="wrap_content"
            android:layout_height="2dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="28dp"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:text="Mobile Number"
            android:textSize="16sp"
            android:background="@android:color/white"
            android:visibility="invisible"/>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="28dp"
            android:layout_marginRight="28dp"
            android:hint="Mobile Number"
            android:textColorHint="@android:color/black"
            app:hintTextAppearance="@style/HintTextStyle">

            <EditText
                android:id="@+id/edit_mobile_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:maxLines="1"
                android:backgroundTint="@android:color/transparent"/>
        </android.support.design.widget.TextInputLayout>
    </RelativeLayout>

    <!-- Promo code -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp">


        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="28dp"
            android:layout_marginRight="28dp"
            android:hint="Promo Code"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:textColorHint="@android:color/black">

            <EditText
                android:id="@+id/edit_promo_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:maxLines="1"/>
        </android.support.design.widget.TextInputLayout>
    </RelativeLayout>
</LinearLayout>
Here is a fragment.
public class PractiseFragment extends Fragment {
    
    
    public PractiseFragment() {
        // Required empty public constructor
    }
    
    TextView textDummyHintMobileNumber;
    EditText editMobileNumber;
    EditText editPromoCode;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_practise, container, false);
    
        textDummyHintMobileNumber = (TextView) view.findViewById(R.id.text_dummy_hint_mobile_number);
      //  textDummyHintPromoCode = (TextView) view.findViewById(R.id.text_dummy_hint_promo_code);
        editMobileNumber = (EditText) view.findViewById(R.id.edit_mobile_number);
        editPromoCode = (EditText) view.findViewById(R.id.edit_promo_code);
    
        // Mobile number
        editMobileNumber.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
            
                if (hasFocus) {
                    new Handler().postDelayed(new Runnable() {
                    
                        @Override
                        public void run() {
                            // Show white background behind floating label
                            textDummyHintMobileNumber.setVisibility(View.VISIBLE);
                        }
                    }, 100);
                } else {
                    // Required to show/hide white background behind floating label during focus change
                    if (editMobileNumber.getText().length() > 0)
                        textDummyHintMobileNumber.setVisibility(View.VISIBLE);
                    else
                        textDummyHintMobileNumber.setVisibility(View.INVISIBLE);
                }
            }
        });
    
        // Promo code
        editPromoCode.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
            
                if (hasFocus) {
                    new Handler().postDelayed(new Runnable() {
                    
                        @Override
                        public void run() {
                            // Show white background behind floating label
                           // textDummyHintPromoCode.setVisibility(View.VISIBLE);
                        }
                    }, 100);
                } else {
                    // Required to show/hide white background behind floating label during focus change
                   /* if (editPromoCode.getText().length() > 0)
                        textDummyHintPromoCode.setVisibility(View.VISIBLE);
                    else
                        textDummyHintPromoCode.setVisibility(View.INVISIBLE);*/
                }
            }
        });
    
        return view;
    }
}
Below code for custom
Here is a workaround:
1. Design your layout structure as below:
activity_test.xml
<?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="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="@android:color/white">

    <!-- Mobile number -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:layout_width="match_parent"
            android:layout_height="52dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/bg_rounded_input_field" />

        <TextView
            android:id="@+id/text_dummy_hint_mobile_number"
            android:layout_width="wrap_content"
            android:layout_height="2dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="28dp"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:text="Mobile Number"
            android:textSize="16sp"
            android:background="@android:color/white"
            android:visibility="invisible"/>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="28dp"
            android:layout_marginRight="28dp"
            android:hint="Mobile Number"
            android:textColorHint="@android:color/black"
            app:hintTextAppearance="@style/HintTextStyle">

            <EditText
                android:id="@+id/edit_mobile_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:maxLines="1"
                android:backgroundTint="@android:color/transparent"/>
        </android.support.design.widget.TextInputLayout>
    </RelativeLayout>

    <!-- Promo code -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp">

        <View
            android:layout_width="match_parent"
            android:layout_height="52dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/bg_rounded_input_field" />

        <TextView
            android:id="@+id/text_dummy_hint_promo_code"
            android:layout_width="wrap_content"
            android:layout_height="2dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="28dp"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:text="Promo Code"
            android:textSize="16sp"
            android:background="@android:color/white"
            android:visibility="invisible"/>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="28dp"
            android:layout_marginRight="28dp"
            android:hint="Promo Code"
            android:textColorHint="@android:color/black"
            app:hintTextAppearance="@style/HintTextStyle">

            <EditText
                android:id="@+id/edit_promo_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:maxLines="1"
                android:backgroundTint="@android:color/transparent"/>
        </android.support.design.widget.TextInputLayout>
    </RelativeLayout>
</LinearLayout>
2. Use below drawable bg_rounded_input_field.xml for rounded corners.
res/drawable/bg_rounded_input_field.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:color="@android:color/black"
        android:width="2dp">
    </stroke>

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

</shape>
3. Use below HintTextStyle to TextInputLayout by adding attribute app:hintTextAppearance="@style/HintTextStyle".
res/values/styles.xml
<style name="HintTextStyle" parent="TextAppearance.Design.Hint">
    <item name="android:textSize">16sp</item>
</style>
4. Finally, in your Activity just show/hide the text_dummy_hint_mobile_number and text_dummy_hint_promo_code during focus change.
FYI, I have used Handler with delay 100 millis to show the dummy hints TextView to sync with TextInputLayout hint text animation.
TestActivity.java
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class TestActivity extends AppCompatActivity {

    TextView textDummyHintMobileNumber;
    TextView textDummyHintPromoCode;
    EditText editMobileNumber;
    EditText editPromoCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        textDummyHintMobileNumber = (TextView) findViewById(R.id.text_dummy_hint_mobile_number);
        textDummyHintPromoCode = (TextView) findViewById(R.id.text_dummy_hint_promo_code);
        editMobileNumber = (EditText) findViewById(R.id.edit_mobile_number);
        editPromoCode = (EditText) findViewById(R.id.edit_promo_code);

        // Mobile number
        editMobileNumber.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                if (hasFocus) {
                    new Handler().postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // Show white background behind floating label
                            textDummyHintMobileNumber.setVisibility(View.VISIBLE);
                        }
                    }, 100);
                } else {
                    // Required to show/hide white background behind floating label during focus change
                    if (editMobileNumber.getText().length() > 0)
                        textDummyHintMobileNumber.setVisibility(View.VISIBLE);
                    else
                        textDummyHintMobileNumber.setVisibility(View.INVISIBLE);
                }
            }
        });

        // Promo code
        editPromoCode.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                if (hasFocus) {
                    new Handler().postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // Show white background behind floating label
                            textDummyHintPromoCode.setVisibility(View.VISIBLE);
                        }
                    }, 100);
                } else {
                    // Required to show/hide white background behind floating label during focus change
                    if (editPromoCode.getText().length() > 0)
                        textDummyHintPromoCode.setVisibility(View.VISIBLE);
                    else
                        textDummyHintPromoCode.setVisibility(View.INVISIBLE);
                }
            }
        });
    }
}
OUTPUT:
enter image description here
That is all. If any help related to this post please comment.

Thank you, guys. 

Enjoy coding.

No comments:

Post a Comment