البرمجة

حل مشكلة تغيير عناصر واجهة المستخدم في Android

في الشفرة التي قدمتها، تقوم بتشغيل حلقة متكررة لتغيير بعض العناصر في واجهة المستخدم (UI) بشكل دوري كل نصف ثانية. ومع ذلك، تواجه مشكلة تتعلق بالتعامل مع عناصر واجهة المستخدم من خلال موضوع (Thread) آخر غير الموضوع الأساسي الذي أنشأ تلك العناصر.

الخطأ الذي تحصل عليه “Only the original thread that created a view hierarchy can touch its views” يحدث عندما تحاول تغيير عناصر واجهة المستخدم من موضوع آخر غير الموضوع الأساسي (الذي أنشأ تلك العناصر). هذا يحدث لأن Android يفرض قيودًا على تغيير عناصر واجهة المستخدم من خلال مواضيع غير الرئيسية لضمان استقرار التطبيق وتجنب حدوث مشاكل مثل الأعطال والتجميد.

لحل هذه المشكلة، يمكنك استخدام الواجهة (Interface) للتواصل بين الموضوع الرئيسي والموضوع الذي يقوم بتغيير عناصر الواجهة. يمكنك القيام بذلك عبر تعريف واجهة تعمل كجسر لتبادل البيانات بين الموضوعين، ثم تنفيذ هذه الواجهة في الموضوع الرئيسي لتغيير عناصر الواجهة.

فيما يلي كيفية تطبيق هذا الحل:

  1. قم بتعريف واجهة (Interface) للتواصل بين الموضوع الرئيسي والموضوع الفرعي:
java
public interface SpeedChangeListener { void onSpeedChanged(float newSpeed); }
  1. قم بتنفيذ هذه الواجهة في الأنشطة (Activity) أو الفراغات (Fragment) التي تحتوي على عناصر الواجهة التي تريد تغييرها:
java
public class MainActivity extends AppCompatActivity implements SpeedChangeListener { // تنفيذ وظيفة التغيير في عناصر واجهة المستخدم @Override public void onSpeedChanged(float newSpeed) { runOnUiThread(() -> { // قم بتغيير عناصر واجهة المستخدم هنا Speedometer1.onSpeedChanged(newSpeed + 8); Speedometer2.onSpeedChanged(newSpeed + 8); Speedometer3.onSpeedChanged(newSpeed + 8); Speedometer4.onSpeedChanged(newSpeed + 8); Speedometer5.onSpeedChanged(newSpeed + 8); Speedometer6.onSpeedChanged(newSpeed + 8); }); } }
  1. ضمن الموضوع الفرعي، قم بإرسال التغييرات باستخدام الواجهة:
java
public class SpeedUpdaterThread extends Thread { private SpeedChangeListener speedChangeListener; public SpeedUpdaterThread(SpeedChangeListener speedChangeListener) { this.speedChangeListener = speedChangeListener; } @Override public void run() { float i; try { for (i = 0; i <= 100; i++) { speedChangeListener.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8); speedChangeListener.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8); speedChangeListener.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8); speedChangeListener.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8); speedChangeListener.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8); speedChangeListener.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8); sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } }
  1. في النهاية، قم ببدء الموضوع الفرعي مع المراقبة عن طريق الموضوع الرئيسي:
java
// داخل نشاط MainActivity SpeedUpdaterThread thread = new SpeedUpdaterThread(this); thread.start();

باستخدام هذا النهج، ستتمكن من تحديث عناصر واجهة المستخدم بأمان من الموضوع الفرعي دون حدوث أخطاء تتعلق بالتعامل مع عناصر واجهة المستخدم من مواضيع غير الرئيسية.

المزيد من المعلومات

بالطبع، هنا بعض المعلومات الإضافية التي قد تكون مفيدة لك:

  1. Thread (الموضوع):

    • الموضوع هو عملية صغيرة أو سلسلة من الإجراءات التي يمكن تنفيذها بشكل مستقل في التطبيق.
    • عند بدء الموضوع، يتم تنفيذ الكود الموجود داخله في تنفيذ مستقل عن الموضوع الرئيسي للتطبيق.
  2. UI Thread (موضوع واجهة المستخدم):

    • هو الموضوع الأساسي الذي يتم من خلاله تحديث وعرض عناصر واجهة المستخدم في تطبيق Android.
    • يجب عدم تعديل عناصر واجهة المستخدم مباشرة من خلال المواضيع الفرعية، وإلا ستحدث مشاكل مثل التجميد أو الأعطال.
  3. runOnUiThread() (تشغيل على واجهة المستخدم):

    • هي طريقة في Android لتنفيذ قطعة من الكود داخل الموضوع الرئيسي (UI Thread).
    • يمكن استخدامها لتحديث عناصر واجهة المستخدم من المواضيع الفرعية بطريقة آمنة.
  4. Interface (الواجهة):

    • تعريف لمجموعة من الطرق (الوظائف) التي يجب أن ينفذها أي كائن ينفذ الواجهة.
    • يمكن استخدام الواجهات في Android كطريقة للتواصل بين مكونات التطبيق المختلفة مثل الأنشطة والخدمات والمواضيع.
  5. التواصل بين المواضيع:

    • يمكن استخدام الواجهات كوسيلة للتواصل بين الموضوع الرئيسي والمواضيع الفرعية في تطبيق Android.
    • يسمح ذلك بإرسال بيانات وطلبات التغييرات بين المواضيع بطريقة منظمة وآمنة.

من خلال فهم هذه المعلومات الإضافية، يمكنك تطبيق الحل الذي تم شرحه بطريقة أكثر فهمًا وتكاملًا في تطبيقك.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر