با سلام خدمت تمامی دوستان عزیز
امروز تکه کدی کاربردی از آقای امیرحسین قاسمی براتون آماده کردیم که امیدواریم مفید و آموزنده باشه براتون
برای پیاده سازی قابلیت بالا باید به این شکل عمل کنیم:
ابتدا در دیزاینر یک ویو از نوع ادیت تکست می سازیم و طول و عرض آن را تنظیم می کنیم. (در برنامه بالا طول و عرض ادیت تکست که نام آن 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 توی کدها به نام ادیت تکست شما تغییر پیدا کنه.
هزینه استفاده از مطالب و کدهای این پست: “۵ عدد صلوات بر محمد و آل محمد”