آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

چگونه باید برای EditText روال delete ایجاد کرد؟

hamed  12 سال پیش  12 سال پیش
+3 0

سلام

ابتدا خلاصه داستان را بگم (بخش آموزشی!)  تا بعد برسیم به سوال خودم:

من یک EditText  دارم با نام فرضی edtTest.
فرض کنید بخواهیم کاربر را مجبور کنیم که به جای استفاده از  کلید حذف روی صفحه کلید از کلید Delete ما استفاده کند. خوب واضح است یک کلید ایجاد می کنیم و در رویداد کلیک آن کد زیر را قرار می دهیم:

  EditText edtTest = (EditText) finedViewById(R.id.edtTest);
Editable editable = edtTest.getText();
int start = edittext.getSelectionStart();
editable.delete(start - 1, start);

خوب تا اینجا کار همه چیز خوبه و این کد کار یک دکمه حذف معمولی را برای ما انجام می ده.

سوال:

اگر بخواهیم در روال مربوط به حذف، هر زمان که کاربر به مثلا کلمه دلخواه "Deletable" رسید کل کلمه حذف شود و نه تک تک حروف آن چه باید کرد؟ توجه کنید که می خواهیم آن کلمه حذف شود و نه اینکه کل ادیت باکس ریست شود.

توجه داشته باشید که کاربر می تواند وسط کلمه مذکور سلکتور را قرار داده باشد.

لطفا هم ایده بهم بدید که بتونم کدی براش بنویسم و یا اینکه اگر راه خلاصه ای داره و دستور خاصی داره برام توضیح بدید.

با تشکر

 

ویرایش:

اگه بخواهم یکم دقیق تر توضیح بدهم اینه که ما یه فرمول ریاضی داریم مثلا: Xb + (Xa)Sin a و می خواهیم وقتی کاربر شروع به حذف یا ویرایش می کند: مثلا از آخر شروع به حذف می کند با هر بار فشردن کلید حذف اول حرف "a" حذف شود و بعد "Sin" و بعد "(" و بعد "Xa" و بعد + و بعد "Xb" و اگر مثلا در وسط کلمه "Sin" هم اگر کلیک کرد و دکمه حذف را زد کل "Sin" حذف شود.

 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
h_r_v  12 سال پیش
+1 0

میتونید متن ادیت تکست رو null کنید!

 EditText editText =(EditText)findViewById(R.id.edit_text);
editText.setText("");
+1 0
ممنون. اما می خواهیم کل آن کلمه حذف شود و نه اینکه کل کلمات. (به کل من رو تازه کار فرض کردی ها!) توی متن بولد می کنم الان. (12 سال پیش)
0 0
شرمنده :دی باید دونه دونه حرفا رو که پاک میکنی چک کنی که فاصله " " هست یا نه! اگه نبود پاکش کن! اگه بود متوقف شو! هم باید حرفای قبل از نشانه گر و هم حرفای بعد از نشانه گر رو اینکار کنی که اگه وسط بود هم پاک بشه! و اینکه همه اینا رو توی setOnClickListener همون دکمه ات انجام بده (12 سال پیش)
+1 0
بله درسته. اما این یه خورده کار را سخت می کنه. اینکه من باید در هر بار که شخص دکمه حذف را فشار می دهد از هر دو طرف محل قرار گرفتن سلکتور به تعداد مثلا 10 کاراکتر را مورد بررسی قرار بدهم و البته در هر لحظه همه جایگشت های ممکن را هم بررسی کنم. کار را کمی پیچیده می کنه و بار محاسباتی سنگسینی را هم برای هر بار فشتر دکمه به سیستم تحویل می کنه. به خصوص اینکه با یک کلمه خاص طرف نیستم و به صورت دینامیک باید از یک لیست در حال تغییر کلمات خوانده شوند. (12 سال پیش)
+1 0
البته درباره این تابع اطلاعاتی ندارم ولی همینطوری سوال می پرسم. با Spanner نمی شه یه کارهایی کرد؟ (12 سال پیش)
0 0
این دو تا لینکو یه نگاهی بندازید! اولی میگه چجوری از یه جا تا یه جا رو select کنیم.. دومی میگه چجوری کلمه های بین یه علامت خاص که واسه ما فاصله " " هست رو ذخیره کنیم : لینک و stackoverflow.com/questions/8646441/how-can-i-get-the-text-before-and-after-the-dash (12 سال پیش)
0 0
حالا محل نشانگر در EditText را چطور باید پیدا کرد؟ (12 سال پیش)
+1 0
لینکی که به صورت url هست را دوباره می گذاری؟ باز نشد. (12 سال پیش)
0 0
لینک (12 سال پیش)
+1 0
اگر در کدی که من نوشته ام در متن سوال دقت کنید توسط دستور getSelectionStart محل سلکتور مشخص می شه. (12 سال پیش)
0 0
Ali لینک (12 سال پیش)
+1 0
ممنون از h_r_v عزیز. لینک ها خیلی خوب بود و یه سری ایده خوب هم بهم داد. البته هنوز مشکل عمده سرجاش باقیه و اون هم اینه که متاسفانه اون کلمه ای که باید پیدا بشه ممکنه خودش دارای چندین فاصله باشه و تازه در برنامه من حاوی کدهای html هم هست. (12 سال پیش)
+1 0
اگه بخواهم یکم دقیق تر توضیح بدهم اینه که ما یه فرمول ریاضی داریم مثلا: Xb + (Xa)Sin a و می خواهیم وقتی کاربر شروع به حذف یا ویرایش می کند مثلا از آخر شروع به حذف می کند اول حرف "a" حذف شود و بعد "Sin" و بعد "(" و بعد "Xa" و بعد + و بعد "Xb" (12 سال پیش)
0 0
دیگه به کل ناامید شدم چون تا قبل این داشتم فکر میکردم که از محل نشانگر تا یه فاصله بعد و قبلش رو حذف کنم اما حالا انگار دیگه برنامه باید هوشمند باشه که بفهمه sin با بقیه فرق داره یا اینکه تعداد این جور کلمات محدود باشه و بشه به برنامه فهموند و بعد هم یه عالمه شرایط مختلف... (12 سال پیش)
+1 0
تازه این بخش خوب قضیه هست. بخش گریه آور قضیه را اصلا اینجا مطرح نکرده ام ; ). اون می شه بخش ویرایش متغیرها و ... که خودش یه داستانیه و البته بعد از یه هفته کلنجار اون را حل کردم. البته توجه کنید که چون من کاربر را مجبور می کنم تا از صفحه کلید من استفاده کنه می تونم طوری برنامه ریزی کنم که دوطرف هر یک از کلمات مهم و مورد نظر یک عبارت خنثی قرار بگیره مثلا: (12 سال پیش)
0 0
میشه بیشتر توضیح دهید :) (12 سال پیش)
+1 0
کدوم بخشش را؟ (12 سال پیش)
0 0
راه حلی که به نظر من میرسه و نمیدونم درسته یا نه : اگر فقط قراره از آخر حذف کنه شما میتونی متن رو بگیری و با دستور ساده split متن رو با " " جدا کنی و بریزی داخل یک آرایه ای از String ها،بعدبا دستور replace آخرین مقدار آرایه رو با "" جایگزین کنی(در واقع حذف کلمه آخر) و در نهایت هم این متن ویرایش شده رو seText کنی (12 سال پیش)
+1 0
ممنون اما متاسفانه دو مشکل وجود داره اینکه اولا ویرایش در وسط متن هم باید ممکن باشه و دوما همانطور که در بالا گفته ام عبارات با فاصله از هم جدا نمی شوند. (12 سال پیش)
0 0
کلا تمامی فیلدهایی که برای جدا سازی دو قسمت بکار میرن چند تان؟غیر از اینه که یا هر چی حرف پشت هم باشه باید حذف شه یا یک علامت؟ (12 سال پیش)
0 0
فعلا مشترک ، دارم میرم بیرون وقت درج جواب ندارم ، آخر شب جواب میدم اگه به نتیجه نرسیدید :| (12 سال پیش)
+1 0
ببخشید بروزر من نظر را درج نمی کنه. (12 سال پیش)
+1 0
من می توانم هر عبارتی را که کاربر می خواهد وارد کند بین دو علامت دلخواه مثلا به صورت عبارت ذخیره کنم. خط تیره و ستاره را برای این گذاشتم تا جهت مرکز و عبارت مشخص بشه وقتی که تعداد زیادی عبارت داریم که کنار هم هستند. (12 سال پیش)
+1 0
عبارت را درست نشون نداد. به این صورت: "عبارت" (12 سال پیش)
+1 0
به صورت یه پاسخ می آورم. و کامل توضیح می دهم. چون کد اچ تی ام ال را می خواهم نشان بدهم. (12 سال پیش)
پاسخ به سوال 
hamed  12 سال پیش
+1 0

من می توانم هر عبارتی را که کاربر می خواهد وارد کند بین دو علامت دلخواه مثلا به صورت عبارت زیر ذخیره کنم. خط تیره و ستاره را برای این گذاشتم تا جهت مرکز و عبارت مشخص بشه وقتی که تعداد زیادی عبارت داریم که کنار هم هستند سیستم بتونه بفهمه که روی کدوم عبارت سلکت شده.

 <*->عبارت<-*>

یعنی مثلا با متنی به صورت زیر مواجه خواهیم بود:

  <*->1عبارت3<-*> <*->عبارت<-*>  <*->عبارت<-*>  <*->عبارت<-*>

حالا می توانیم محل سلکتور را در ادیت باکس از دستور زیر استخراج کنیم: 

 
  EditText edtTest = (EditText) finedViewById(R.id.edtTest);
Editable editable = edtTest.getText();
int start = edittext.getSelectionStart();

حالا می مونه اینکه چطور عبارت مورد سلکت را پیدا کنیم؟

+1 0
دارم به این موضوع فکر می کنم که توسط دو حلقه جدا مختصات اولین علامت ممیزه را (کوچیکتر-ستاره-خط-بزرگتر) را در طرف چپ و راست پیدا بکنم و بعد هم هر چیزی بین این دو تا هست را حذف کنم. (12 سال پیش)
+1 0
متاسفانه فعلا با این روش هم به بن بست خوردم. هر چند حلقه هایی که در نظر فوق به اون ها اشاره کردم به درستی کار می کنن. اما اون کاراکترهایی که دو طرف عبارت می گذارم اگر در ادیت باکس نشون داده نشوند در editable هم ریخته نمی شوند. به این ترتیب نمی شود روی آن ها فآیندی را اجرا کرد. اگر بخواهم از کاراکترهایی دیگری هم استفاده کنم اون وقت چون در ادیت باکس دیده می شوند کاربر دچار اشکال می گردد و گیج می شود. حالا اگر راهی پیدا بشه که بتوان کاراکتری را در متن زد که کاربر اون را نبینه ولی وجود داشته باشه مشکل حله. این است یک مسئله فلسفی! (12 سال پیش)
پاسخ به سوال 
hamed  12 سال پیش
+1 0

خوب من هنوز منتظر جواب های دوستان هستم. با این وجود کد زیر را نوشتم و البته درست کار می کنه ولی هنوز به دل خودم نچسبیده چون به نظرم باید راه شسته رفته تری هم باشه. البته در این کد بر خلاف میلم کاراکتر اسپیس را به عنوان حد فاصل بین عباراتگذاشته ام که خوب بخش زیادی از برنامه ام را دچار مشکل می کنه و باید توی اون باز بینی کنم!

این هم کد:

                EditText edttest = (EditText) findViewById(R.id.edttest);
Editable editable = edttest.getText();
int start = edttest.getSelectionStart();

char[] Str2 = new char[1];
int rightIndex = 0;
int leftIndex = 0;
Log.i("log", "clicked " + start);

if (start != 0 && start != editable.length()) {
while ((leftIndex == rightIndex)) {
String str = "-";
int i = 0;
while ( !str.equals(" ")) {
editable.getChars(start + i - 1, start + i , Str2, 0);
str = new String(Str2);
if (str.equals(" ")) {
rightIndex = start + i ;
}
i++;
}
i = 0;
str = "-";
while ( !str.equals(" ") && start - i - 1 >= 0) {
editable.getChars(start - i - 1, start - i , Str2, 0);
str = new String(Str2);
if (str.equals(" ")) {
leftIndex = start - i;
}
i++;
}
editable.delete(leftIndex, rightIndex);
start--;
}
edttest.setSelection(start - 1);
}
}

توضیح:
به صورت خلاصه این کد از محل کلیک کاربر به سمت دو طرف حرکت می کنه تا به اسپیس برسه و مختصات اسپیس ها را ذخیره می کنه.
بعد از اون ما می توانیم عبارت بین این دو اسپیس را به همراه یکی از اون ها (که به عنوان قرارداد سمت راستی را) حذف می کنیم.
حلقه بزرگتر که در برگیرنده این دو حلقه است نیز برای این ایجاد شده که اگر چند اسپیس پشت سر هم داشتیم برنامه متوقف نشه و یکی یکی اون ها را رد کنه تا به نزدیک ترین عبارت برسه.
اون عبارت شرط هم که در برگیرنده کل حلقه هاست برای اینه که اکر نشانگر ابتدای باکس یا انتهای باکس بود برنامه به دلیل منفی شدن متغیرها کرش نکنه.

پاسخ به سوال 
مجتبی یگانه  12 سال پیش
+1 0

من خیلی متوجه قسمت های جدید سوالتون یعنی این نشانه گذاری و اینها نشدم اما برای پاک کردن کلمه ای به این شکل عمل کنید

  1. کلیک روی دکمه => حذف یک کارکتر
  2. کلیک طولانی  => حدف یک کلمه
  3. کلیک بیشتر از 2 ثانیه => حذف کل متن

میتونید به سلیقه ی خودتون زمانبدی رو تغییر بدید - حذف یک کارکتر که سادست ، حذف یک کلمه هم میتونید با توابعی مثل indexOf و lastIndexOf و ... برسی کنید و بگید از آخرین فاصله به بعد تو رویداد لانگ کلیک پاک بشه.

+1 0
ممنون از وقتی که می گذارید. بله. کاری که من مجبور شدم انجام بدهم هم در نهایت همینه. (البته من همه را در یک دکمه گذاشته ام و می خواهم فقط کلمه به کلمه حذف بشه) که با توجه به indexOf و lastIndexOf که شما معرفی کردید و خیلی بدرد بخور هستند، خیلی اصولی تر هم می شه. و البته مطابق الگوریتم کدی که نوشتم اگر کاربر وسط یه کلمه هم کلیک کنه و دکمه حذف رو بزنه همه اون کلمه حذف می شه. (12 سال پیش)
0 0
در مورد String Builder هم تحقیق کنید ، کنترل بیشتری روی String ها داره :) - موفق باشید (12 سال پیش)
+1 0
ببخشید این span چیه؟ به این قضایا مربوط می شه یا گرافیکیه؟ (12 سال پیش)
0 0
اگه منظورتون Span , SpannedText و.. هست ، متنی که شامل استایل html باشه رو میگن (12 سال پیش)
+1 0
ممنون. آره منظورم همونه. تو دستورات مربوط به Editable دیدمش، گفتم چون span (به معنی محدوده) داره یه وقت مربوط بشه. چه می کشم من از این اچ تی ام ال نابلدی. باید برم یکی دو روز وقت بذارم لااقل کلیاتش دستم بیاد. (12 سال پیش)
پاسخ به سوال 
hamed  12 سال پیش
+1 0

خوب دوستان بالاخره با این کد تمومش کردمو خوب جواب می ده هر چند شاید کد بهینه تری هم بشه نوشت. هر چند که آخرش مجبور شدم صورت وسئله را عوض کنم!)

برای آیندگان توضیح می دهم:

توسط این کد که در روال کلیک یک دکمه قرار می گیرد با فشرده شدن دکمه کلمات حذف خواهند شد و نه تک تک حروف. فرقی هم نداره کاربر کجای متن را انتخاب کرده باشه و یا کلیک کرده باشه. اگر وسط کلمه کلیک کرده باشه که حذف می شود و اگر اول اون باشه هم تبعا کلمه قبلی حذف می شه.

EditText edttest = (EditText) findViewById(R.id.edttest);
Editable editable = edttest.getText();
int start = edttest.getSelectionStart();
char[] Str2 = new char[1];
int rightIndex = 0;
int leftIndex = 0;



rightIndex = editable.toString().indexOf(" ", start);
leftIndex = editable.toString().lastIndexOf(" ", start);
if (start == leftIndex + 1) {
start = start - 2;
rightIndex = editable.toString().indexOf(" ", start);
leftIndex = editable.toString().lastIndexOf(" ", start);
}
if (leftIndex == rightIndex) {
start = start - 1;
rightIndex = editable.toString().indexOf(" ", start);
leftIndex = editable.toString().lastIndexOf(" ", start);
}
if (rightIndex == -1) {
rightIndex = editable.length();
}
if (leftIndex == -1) {
leftIndex = 0;
editable.delete(leftIndex, rightIndex); //for seriate space deleting

با تشکر از دوستانی که کمک کردن


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .