سلام
امروز سورس کد اپ سیگنالُ دانلود کردم داشتم سَرک میکشیدم تو کدها ک چشمم خورد به یه چیزی شبیه این عکس پایین (البته نمونه های زیادی هست)
و تو کدها رو گشتم و پیدا کردم و گفتم شاید بدرد کسی بخوره چون خیلی ساده درست کرده بود
شروع کنیم
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:id="@+id/border" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="9dp" android:background="@drawable/labeled_edit_text_background_inactive" /> <LinearLayout android:id="@+id/text_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/label" style="@style/Signal.Text.Caption" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginEnd="12dp" android:background="@android:color/white" android:paddingStart="4dp" android:paddingEnd="4dp" android:textColor="@color/core_ultramarine" tools:text="Profile Name" /> </LinearLayout> </merge>`
2. یک کلاس درست میکنیم به اسم LabeledEditText (بازم دلخواه) و کد زیرُ تایپ کنید:
public class LabeledEditText extends FrameLayout implements View.ChangeListener { private TextView mLabel; private EditText mInput; private View mBorder; private ViewGroup mTextContainer; public LabeledEditText(@NonNull Context context) { super(context); init(null); } public LabeledEditText(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(attrs); } private void init(@Nullable AttributeSet attrs) { inflate(getContext(), R.layout.labeled_edit_text, this); String labelText = "" int backgroundColor = Color.BLACK; int textLayout = R.layout.labeled_edit_text; if (attrs != null) { TypedArray typedArray = getContext().getTheme() .obtainStyledAttributes(attrs, R.styleable.LabeledEditText, 0, 0); labelText = typedArray.getString(R.styleable.LabeledEditText_LE_label); backgroundColor = typedArray.getColor(R.styleable.LabeledEditText_LE_background, Color.BLACK); textLayout = typedArray.getResourceId(R.styleable.LabeledEditText_LE_textLayout, R.layout.labeled_edit_text); typedArray.recycle(); } mLabel = findViewById(R.id.label); mBorder = findViewById(R.id.border); mTextContainer = findViewById(R.id.text_container); inflate(getContext(), textLayout, mTextContainer); mInput = findViewById(R.id.input); mLabel.setText(labelText); mLabel.setBackgroundColor(backgroundColor); if (TextUtils.isEmpty(labelText)) { mLabel.setVisibility(INVISIBLE); } mInput.setChangeListener(this); } public EditText getInput() { return mInput; } public void setText(String text) { mInput.setText(text); } public Editable getText() { return mInput.getText(); } @Override public void Change(View view, boolean b) { mBorder.setBackgroundResource(b ? R.drawable.labeled_edit_text_background_active : R.drawable.labeled_edit_text_background_inactive); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); mInput.setEnabled(enabled); } }`
3. یه فایل به اسم attrs میسازیم در مسیر values و کدهای زیرُ تایپ میکنیم:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="LabeledEditText"> <attr name="LE_label" format="string" /> <attr name="LE_background" format="color" /> <attr name="LE_textLayout" format="reference" /> </declare-styleable> </resources>`
4. در فایل colors هم رنگهای زیرُ تایپ کنید:
<color name="core_grey_25">#b9b9b9</color> <color name="core_ultramarine">#2c6bed</color> <color name="transparent">#00FFFFFF</color>`
5. در فایل styles:
<style name="Signal.Text.Caption" parent="Base.TextAppearance.AppCompat.Caption"> <item name="android:textSize">12sp</item> <item name="android:lineSpacingExtra">2sp</item> <item name="android:fontFamily">sans-serif</item> </style>`
6.در مسیر layout یه فایل دیگه بسازید به اسم name_text و کدهای زیرُ تایپ کنید:
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/input" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="7dp" android:paddingStart="16dp" android:paddingEnd="16dp" android:paddingBottom="16dp" android:background="@color/transparent" android:singleLine="true" android:saveEnabled="false" android:hint="نام" tools:text="امیر بختیاری" />`
در نهایت در مسیر drawable فایل هایی با نام labeled_edit_text_background_inactive و labeled_edit_text_background_active بسازید و کدهای زیرُ باز هم تایپ کنید
****************************Active**************************** <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="4dp" /> <stroke android:color="@color/core_ultramarine" android:width="2dp" /> </shape> ****************************inactive**************************** <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="4dp" /> <stroke android:color="@color/core_grey_25" android:width="1dp" /> </shape>`
برای استفاده هم:
<ir.amirbakhtiari.customview.LabeledEditText android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="10dp" app:LE_background="@android:color/white" app:LE_label="نام" app:LE_textLayout="@layout/name_text" />`