رفتن به مطلب
  • 0

مشکل Focus و Sender در EditText


razavioo

سوال

سلام دوستان عزیز

مشکلی که دارم اینه که تعدادی ادیت تکست رو داخل یک حلقه تودرتو ساخته م و همه شون رو با یک Event Name مشابه Initialize کرده م و همه چیزش به درستی کار می کنه ولی وقتی که می خواهم از دو تابع FocusChanged و TextChanged و استفاده از Sender برای مشخص کردن اینکه کدوم EditText فوکوس داره استفاده کنم، فقط و فقط آخرین Edittext ساخته شده داخل حلقه دریافت میشه و Sender آخرین ادیت تکست رو دریافت می کنه.

RequestFocus استفاده کردم و نتیجه ای نگرفتم و باز هم آخرین Edittext ساخته شده رو فراخوانی می کنه.

واقعیت اینه که وقتی با Button ها کار می کنم، همه چیز مشخصه چون یا روی دکمه کلیک شده یا نشده و راحت میشه Sender رو استفاده کرد، ولی در EditText من، Focus روی یک EditText دیگه هست در حالی که من در حال ایجاد تغییر بر روی دیگری هستم. خوشحال میشم یک نفر یک یا چند راه حل خوب بهم معرفی کنه تا بررسی بکنم.

Sub Samplesub(rows As Int, columns As Int)
	maxrc = Max(rows, columns)
	If Power(maxrc,2) > 101 Or rows < 2 Or columns < 2 Then
		Return
	End If
	Try
		plabel.RemoveAllViews
		plabel.RemoveView
		pedittext.RemoveAllViews
		pedittext.RemoveView
	Catch
		Log("Cant Remove Panels")
	End Try
	
	cd.Initialize2(Colors.White, 0, 1dip, Colors.Black)
	Dim label1 As Label
	plabel.Initialize("plabel")
	pedittext.Initialize("pedittext")
	Activity.AddView(plabel, 0, 0, x, y)
	Activity.AddView(pedittext, 0, 0, x, y)
	For j = 1 To columns
		For i = 1 To rows
			If j = 1 Then
				label1.Initialize("")
				plabel.AddView(label1, x-x/(maxrc+2)-(i)*(x/(maxrc+2)), 0, x/(maxrc+2), x/(maxrc+2))
				label1.Text = i
				label1.Gravity = Gravity.CENTER
			End If
			et.Initialize("et")
			et.Gravity = Gravity.CENTER
			et.Background = cd
			et.TextColor = Colors.black
			inputmethod1.SetCustomFilter(et,et.INPUT_TYPE_TEXT,".ابتثجچحخدذرزژسشصضطظعغفقکگلمنوهی")
			inputmethod1.SetLengthFilter(et,1)
			et.Tag = i+(j-1)*column
			et.TextSize = 40 - 2*(maxrc)
			pedittext.AddView(et, x-x/(maxrc+2)-(i)*(x/(maxrc+2)), j*(x/(maxrc+2)), x/(maxrc+2), x/(maxrc+2))
			Dim jo As JavaObject = et
	     	jo.RunMethod("setPadding", Array As Object(0, 1dip, 0, 0))
		Next
		label1.Initialize("")
		plabel.AddView(label1,x-x/(maxrc+2), j*(x/(maxrc+2)), x/(maxrc+2), x/(maxrc+2))
		label1.Text = j
		label1.Gravity = Gravity.CENTER
	Next
End Sub

Sub et_FocusChanged (HasFocus As Boolean)
If HasFocus = False Then
For Each v As View In pedittext.GetAllViewsRecursive
Dim e2 As EditText = v
If e2.Text = "." Then
cd.Initialize2(Colors.Black, 0, 1dip, Colors.Black)
e2.Background = cd
e2.TextColor = Colors.White
Else
e2.Color = Colors.White
e2.TextColor = Colors.Black
End If
Next
End If
End Sub

Sub et_TextChanged (Old As String, New As String)
Dim emi As EditText = Sender
If emi.RequestFocus = True Then
Log(emi.Tag)
End If
End Sub

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

4 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

 

سلام دوستان عزیز

مشکلی که دارم اینه که تعدادی ادیت تکست رو داخل یک حلقه تودرتو ساخته م و همه شون رو با یک Event Name مشابه Initialize کرده م و همه چیزش به درستی کار می کنه ولی وقتی که می خواهم از دو تابع FocusChanged و TextChanged و استفاده از Sender برای مشخص کردن اینکه کدوم EditText فوکوس داره استفاده کنم، فقط و فقط آخرین Edittext ساخته شده داخل حلقه دریافت میشه و Sender آخرین ادیت تکست رو دریافت می کنه.

RequestFocus استفاده کردم و نتیجه ای نگرفتم و باز هم آخرین Edittext ساخته شده رو فراخوانی می کنه.

واقعیت اینه که وقتی با Button ها کار می کنم، همه چیز مشخصه چون یا روی دکمه کلیک شده یا نشده و راحت میشه Sender رو استفاده کرد، ولی در EditText من، Focus روی یک EditText دیگه هست در حالی که من در حال ایجاد تغییر بر روی دیگری هستم. خوشحال میشم یک نفر یک یا چند راه حل خوب بهم معرفی کنه تا بررسی بکنم.

Sub Samplesub(rows As Int, columns As Int)
	maxrc = Max(rows, columns)
	If Power(maxrc,2) > 101 Or rows < 2 Or columns < 2 Then
		Return
	End If
	Try
		plabel.RemoveAllViews
		plabel.RemoveView
		pedittext.RemoveAllViews
		pedittext.RemoveView
	Catch
		Log("Cant Remove Panels")
	End Try
	
	cd.Initialize2(Colors.White, 0, 1dip, Colors.Black)
	Dim label1 As Label
	plabel.Initialize("plabel")
	pedittext.Initialize("pedittext")
	Activity.AddView(plabel, 0, 0, x, y)
	Activity.AddView(pedittext, 0, 0, x, y)
	For j = 1 To columns
		For i = 1 To rows
			If j = 1 Then
				label1.Initialize("")
				plabel.AddView(label1, x-x/(maxrc+2)-(i)*(x/(maxrc+2)), 0, x/(maxrc+2), x/(maxrc+2))
				label1.Text = i
				label1.Gravity = Gravity.CENTER
			End If
			et.Initialize("et")
			et.Gravity = Gravity.CENTER
			et.Background = cd
			et.TextColor = Colors.black
			inputmethod1.SetCustomFilter(et,et.INPUT_TYPE_TEXT,".ابتثجچحخدذرزژسشصضطظعغفقکگلمنوهی")
			inputmethod1.SetLengthFilter(et,1)
			et.Tag = i+(j-1)*column
			et.TextSize = 40 - 2*(maxrc)
			pedittext.AddView(et, x-x/(maxrc+2)-(i)*(x/(maxrc+2)), j*(x/(maxrc+2)), x/(maxrc+2), x/(maxrc+2))
			Dim jo As JavaObject = et
	     	jo.RunMethod("setPadding", Array As Object(0, 1dip, 0, 0))
		Next
		label1.Initialize("")
		plabel.AddView(label1,x-x/(maxrc+2), j*(x/(maxrc+2)), x/(maxrc+2), x/(maxrc+2))
		label1.Text = j
		label1.Gravity = Gravity.CENTER
	Next
End Sub

Sub et_FocusChanged (HasFocus As Boolean)
If HasFocus = False Then
For Each v As View In pedittext.GetAllViewsRecursive
Dim e2 As EditText = v
If e2.Text = "." Then
cd.Initialize2(Colors.Black, 0, 1dip, Colors.Black)
e2.Background = cd
e2.TextColor = Colors.White
Else
e2.Color = Colors.White
e2.TextColor = Colors.Black
End If
Next
End If
End Sub

Sub et_TextChanged (Old As String, New As String)
Dim emi As EditText = Sender
If emi.RequestFocus = True Then
Log(emi.Tag)
End If
End Sub

خودم بعد از کلی سر و کله زدن با مشکل بالاخره حلش کردم و برای اینکه دوستانی ک مشکل مثل من پیدا می کنن بدونن چی شده می نویسمش :

مشکل اینجا بود که من کد تعریف et رو داخل Sub Global انجام دادم در حالی که باید این تعریف داخل حلقه های تو در تویی که قرار بود یکی یکی این EditText ها رو بسازه، تعریفش می کردم. همین.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

متغیرهاتون نبود و مشخص نبود چی به چیه

ادیت تکست رو تگ آیدی بدین بهش

و

For Each v As View In Activity.GetAllViewsRecursive 'esme panelet'
'کد بالا هم میشه پنل رو بگیری و هم اکتیویتی ولی بهتره کل اکتیویتی رو بگیرین'
   If v Is edittext Then 'migim toye panel ha EDITEXT ro bgir'
     Dim b As Edittext = v
      
If b.text= ""  Then
ToastMessageShow("یلد خالیه",False)

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

تنها چیزی که داخل کد ها نبود pedittext بود که در واقع من ادیت تکست ها رو داخل این پنل قرار داده بودم و به جای کدی که شما برای اکتیویتی نوشتید، من برای این پنل این کد رو نوشتم و مشکلم حل نشده.

همونطور که گفتم این راه های مشخص رو چک کردم و مطمئنم این نیست. مشکل اینه که فوکوس به طور خودکار و بدون اینکه بتونم کنترلش کنم به آخرین ادیت تکستی که داخل حلقه ایجاد میشه، منتقل میشه.

 

اینم بقیه کد :

Sub Globals
	Dim inputmethod1 As IME
	Dim cursor1 As Cursor
	Dim erow, ecolumn, et As EditText
	Dim b As Button
	Dim x As Int = Activity.Width
	Dim y As Int = Activity.Height
	Dim row, column As Int
	Dim plabel, pedittext As Panel
	Dim cd As ColorDrawable
End Sub
Sub Activity_Create(FirstTime As Boolean)
	inputmethod1.Initialize("inputmetod1")
	row = 5
	column = 5
	createjadval(row,column)
End Sub
لینک ارسال
به اشتراک گذاری در سایت های دیگر

up

 

به جوابم نرسیدم و امیدوارم یک نفر پاسخ بده به سوال من.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

متغیرهاتون نبود و مشخص نبود چی به چیه

ادیت تکست رو تگ آیدی بدین بهش

و

For Each v As View In Activity.GetAllViewsRecursive 'esme panelet'
'کد بالا هم میشه پنل رو بگیری و هم اکتیویتی ولی بهتره کل اکتیویتی رو بگیرین'
   If v Is edittext Then 'migim toye panel ha EDITEXT ro bgir'
     Dim b As Edittext = v
      
If b.text= ""  Then
ToastMessageShow("یلد خالیه",False)

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...