با سلام خدمت تمامی دوستان عزیز
امروز تکه کدی کاربردی از آقای امیرحسین قاسمی براتون آماده کردیم که امیدواریم مفید و آموزنده باشه براتون

برای پیاده سازی قابلیت بالا باید به این شکل عمل کنیم:
ابتدا در دیزاینر یک ویو از نوع ادیت تکست می سازیم و طول و عرض آن را تنظیم می کنیم. (در برنامه بالا طول و عرض ادیت تکست که نام آن EditText1 است، به شکل زیر در دیزاینر تنظیم شده است) :
EditText1.SetLeftAndRight(0,100%x) EditText1.SetTopAndBottom(0,100%y)
تیک دوتا کتابخونه JavaObject و EditTextPlus رو می زنیم.
حال یک سری متغیر نیاز داریم که در سرتاسر اکتویتی کار کند:
Sub Globals Private EditText1 As EditText Dim etplus As EditTextPlus Dim mylines As Int=0 Dim temp As String Dim total As String="" Dim EnterClicked As Boolean=False End Sub
بخش اکتویتی کریت:
به صورت پیشفرض هنگامی که کیبورد بالا می آید دکمه آن “انجام شد” است و ما برای اینکه بتوانیم خطوط جدیدی در ادیت تکست ایجاد کنیم (توی ادیت تکست اینتر بزنیم) باید یک سری کد در اکتویتی کریت قرار دهیم. و در خط آخر نیز گفته ایم که متن ها در کل ادیت تکست پخش شوند و ادیت تکست فقط یک خط نباشد.
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Dim JO As JavaObject = EditText1
JO.RunMethod("setImeOptions",Array As Object(KeyCodes.KEYCODE_ENTER))
Dim O As Object = JO.CreateEvent("android.widget.TextView.OnEditorActionListener","Enter",Null)
JO.RunMethod("setOnEditorActionListener",Array As Object(O))
EditText1.SingleLine=False
End Sub
حال ساب های زیر را بین دو ساب دیگر قرار دهید:
Sub check(str As String)As Boolean
If str.Contains(".") Then
Try
Dim before As Int=str.SubString2(0,str.IndexOf("."))
temp=before&"."
Return True
Catch
Return False
End Try
End If
End Sub
Sub MySetSelection(position As Int)
Dim jo As JavaObject= EditText1
jo.RunMethod("setSelection",Array As Object(position))
End Sub
Sub MyGetSelectionStart As Object
Dim jo As JavaObject=EditText1
Return jo.RunMethod("getSelectionStart",Null)
End Sub
Sub Enter_Event(MethodName As String,Args() As Object) As Object
If EnterClicked=False Then
etplus.insertTextToCursorPosition(EditText1,CRLF&"")
EnterClicked=True
Return True
Else
EnterClicked=False
Return True
End If
End Sub
در بالا، ساب اول (check) بررسی می کنه که آیا قبلا متن یک خط شماره گذاری شده یا نه!
ساب دوم (MySetSelection) مکان Cursor یا همون خط چشمک زن توی ادیت تکست رو تنظیم می کنه.
ساب سوم (MyGetSelectionStart) مکان فعلی Cursor رو میگیره.
ساب چهارم (Enter_Event) هم رویداد کلیک روی دکمه اینتر توی کیبورد هست که توی این ساب گفتیم بیا برو خط بعدی. (این ساب دو بار پشت سر هم اجرا میشه و به همین دلیل با متغیر بولین کنترلش کردیم که فقط بار اول کدهای داخلش کار کنه و گرنه اگر این کار رو نمی کردیم با یک کلید دوتا اینتر می خورد!)
توجه کنید که نیازی به ساب های دوم و سوم نبود و می تونستیم با متدهای ادیت تکست که توی خود b4a هست نیز کارهای همین ساب ها رو انجام بدیم اما من ترجیح دادم خودم ساب هاشو بنویسم.
و اما مهمترین ساب این هست(این ساب رو هم مثل ساب های دیگه بین دوتا ساب قرار بدین) :
Private Sub EditText1_TextChanged (Old As String, new As String)
Try
If EditText1.Text<>total Then
If EditText1.Text="" Then
mylines=0
End If
If mylines<>etplus.getLineCount(EditText1) Then
total=""
mylines=etplus.getLineCount(EditText1)
For i=1 To mylines
Dim mylinestr As String=etplus.getTextOfALines(EditText1,i)
If check(mylinestr) Then
mylinestr=mylinestr.Replace(temp,"")
Try
mylinestr=mylinestr.Replace("","")
Catch
End Try
mylinestr=i&"."&mylinestr
If i<>mylines Then
mylinestr=mylinestr&CRLF
End If
Else
mylinestr=i&"."&mylinestr
If i<>mylines Then
mylinestr=mylinestr&CRLF
End If
End If
total=total&mylinestr
Next
EditText1.Text=total
MySetSelection(EditText1.Text.Length)
End If
End If
Catch
End Try
End Sub
این ساب بالا زمانی اجرا میشه که متن داخل ادیت تکست تغییر کنه و شماره گذاری خطوط توی همین ساب انجام میشه. ممکنه کمی گیج کننده به نظر برسه اما اگه بشینید و تحلیلش کنید خیلی راحته.
-این قابلیت هم توی ادیت تکست های چپ چین و هم راست چین شده کار میکنه(هم برای متون فارسی و هم انگلیسی).
-توی این مثال نام ادیت تکست ما EditText1 بود اگه برای شما نامش فرق می کنه باید کل کلمات EditText1 توی کدها به نام ادیت تکست شما تغییر پیدا کنه.
هزینه استفاده از مطالب و کدهای این پست: “۵ عدد صلوات بر محمد و آل محمد”
