انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#1
Lightbulb 
با سلام به همه دوستان  Idea
من یه برنامه دارم که حدود 50 اکتیویتی از یک xml استفاده میکنند وداخل اون xml از ویجت های(imageview,button) زیادی استفاده کردم   (حدود 25 تا) و این ویجت ها رو در اکتیویتی ها در متد on creat توسط  findViewById(R.id........)  تعریف کردم
مشکل: برنامم برای ورود به هر اکتیویتی مکث میکنه و کنده و گاهی force close میده ...
آیا علتش مربوط به xml هست؟؟؟
آیا روش بهینه تری وجود داره؟
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#2
سلام.
تعداد 25 عنصر در یک فایل xml ، زیاد نیست و مشکلی از این نظر وجود ندارد.
تعداد Activity هایی که از فایل xml استفاده می کنند نیز اهمیتی ندارد. دقت کنید که هر بار، تنها یک Activity در foreground در حال اجرا می باشد و جدا از این نکته، مثلا ما در ساخت یک ListView ، از فایل xml برای تعیین ساختار گرافیکی هر ردیف (row - item) از ListView استفاده می کنیم و بنابراین تعداد ارجاعات به فایل xml ، زیاد است، اما مشکلی به وجود نمی آید.
در مورد کند بودن، باید ببینید که چه بخشی از کدها روند برنامه را کند می کند. بهتر بود کدها را ذکر می کردید (هم کد Activity و هم کدی که برای ورود به Activity در Activity قبلی به کار رفته). 

در مورد Force Close ، باید خطایابی کنید و متن خطا را بیابید :

کلید شماره 813

کلید شماره 6968

Flower
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط sami

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#3
ممنون از پاسخگویی شما استاد عزیز اینم کدها
ساختار اکتیویتی اول به اینصورته:

کد:
...
public class MainActivity extends Activity implements OnClickListener{

    static Button btn1,...;
    final Context context = this;
    Animation scalebtn;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity-main);

        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(this);
       ...
       ...
       btn30.....

    }

    @Override
    public void onClick(View v) {
        
    if (v == btn1){
        btn1.startAnimation(scalebtn);
            Intent myIntent = new Intent(context, Activity1.class);
            startActivityForResult(myIntent, 0);

    }
    .
    .
    .
    if (v == btn30){
        btn30.startAnimation(scalebtn);
            Intent myIntent = new Intent(context, Activity30.class);
            startActivityForResult(myIntent, 0);

    }

}

    @Override
    protected void onResume() {
        super.onResume();
           Saveshared.Init(this);
           Saveshared.Load();
    }
}

و اکتیویتی هایی که توسط زدن کلیدهای اکتیویتی بالا، باز میشن ساختارشون به صورت زیر هست:


کد:
...
public class Activity1 extends Activity implements OnClickListener {

    final Context context = this;
   Button btn1,...;
   ImageView img1,...;
   ...
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);

        img1 = (ImageView) findViewById(R.id.imageView1);
       ....
        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(this);
       ....
       ....
   }
    @Override
    public void onClick(View v) {
        
        if (v == btn1){
            //some code
        }
        ...
        ...
    }
   void saveData() {
       SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
       spe.putInt("sharedKey", i);
       spe.commit();
   }
   void loadData() {
       SharedPreferences sp = getPreferences(MODE_PRIVATE);
       daryaftseke = sp.getInt("sharedKey", i);
   }
    @Override
    protected void onResume() {
        super.onResume();
           loadData();
           Soundpool.Initsound(this);
           Soundpool.soundpool();
    }
    @Override
   public void onPause() {
        super.onPause();
       Soundpool.soundPool.release();
       Soundpool.soundPool = null;
        return;
    }
}
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#4
ممنون از پاسخگویی شما استاد عزیز اینم کدها
ساختار اکتیویتی اول به اینصورته:
کد:
...
public class MainActivity extends Activity implements OnClickListener{

    static Button btn1,...;
    final Context context = this;
    Animation scalebtn;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity-main);

        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(this);
       ...
       ...
       btn30.....

    }

    @Override
    public void onClick(View v) {
        
    if (v == btn1){
        btn1.startAnimation(scalebtn);
            Intent myIntent = new Intent(context, Activity1.class);
            startActivityForResult(myIntent, 0);
finish();
    }
    .
    .
    .
    if (v == btn30){
        btn30.startAnimation(scalebtn);
            Intent myIntent = new Intent(context, Activity30.class);
            startActivityForResult(myIntent, 0);
finish();
    }

}

    @Override
    protected void onResume() {
        super.onResume();
           Saveshared.Init(this);
           Saveshared.Load();
    }
}

و اکتیویتی هایی که توسط زدن کلیدهای اکتیویتی بالا، باز میشن ساختارشون به صورت زیر هست:


کد:
...
public class Activity1 extends Activity implements OnClickListener {

    final Context context = this;
   Button btn1,...;
   ImageView img1,...;
   ...
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);

        img1 = (ImageView) findViewById(R.id.imageView1);
       ....
        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(this);
       ....
       ....
   }
    @Override
    public void onClick(View v) {
        
        if (v == btn1){
            //some code
        }
        ...
        ...
    }
   void saveData() {
       SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
       spe.putInt("sharedKey", i);
       spe.commit();
   }
   void loadData() {
       SharedPreferences sp = getPreferences(MODE_PRIVATE);
       daryaftseke = sp.getInt("sharedKey", i);
   }
    @Override
    protected void onResume() {
        super.onResume();
           loadData();
           Soundpool.Initsound(this);
           Soundpool.soundpool();
    }
    @Override
   public void onPause() {
        super.onPause();
       Soundpool.soundPool.release();
       Soundpool.soundPool = null;
        return;
    }
}
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#5
این بخش از کدها را ببینید :

کد پی‌اچ‌پی:
Intent myIntent = new Intent(contextActivity1.class);
startActivityForResult(myIntent0); 

شما از روش startActivityForResult برای رفتن به  Activity دوم استفاده کرده اید. به جای آن، همان کد معمولی درج شده در کلید زیر را به کار ببرید (استفاده از روش startActivity) :

کلید شماره 2727

ببینید با اعمال این تغییر، مشکل برطرف می شود یا نه. 
البته در کل، اگر startActivityForResult را برای دریافت نتیجه از Activity دوم به کار نبرده اید (که احتمالا این طور است، چون روش onActivityResult که برای دریافت نتیجه از Activity دوم و پردازش آن است، در Activity اول نوشته نشده)، توصیه می شود که همان روش startActivity را به کار ببرید. در لینک زیر، یک مثال در مورد روش startActivityForResult وجود دارد تا متوجه شوید که برای چه منظوری به کار می رود :

http://www.javatpoint.com/android-starta...lt-example

------------------------------------------

اگر تغییر مورد نظر را اعمال کردید و مشکل برطرف نشد، توصیه می کنم کدهای روش onResume در Activity دوم را بررسی کنید. ببینید مثلا با حذف آنها، مشکل برطرف می شود یا خیر.
هر موردی که مشکل مربوط به آن است را با AsyncTask اجرا نمایید.

------------------------------------------

در ارسال دوم که دوباره کدها را ذکر کرده بودید، مشاهده کردم که کد زیر نیز نوشته شده است :

کد پی‌اچ‌پی:
finish(); 

که برای بسته شدن Activity به صورت کامل (destroy شدن آن) به کار می رود. توصیه می شود، این کد را حذف کرده و آن را در روش onPause بنویسید. به کار رفتن آن، دقیقا بعد از کد رفتن به Activity بعدی، گاهی مشکلاتی را ایجاد می کند.
دلیل نوشتن آن در روش onPause این است که چون به Activity بعدی می رویم، پس در Activity فعلی، روش onPause اجرا می شود و بنابراین با اجرای کد بالا، Activity به صورت کامل بسته می شود و به background نخواهد رفت. در این زمینه، کلید شماره 230 را بخوانید.

Flower
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#6
Lightbulb 
ممنون از راهنمایی شما نکات بسیار مفیدی بود و اعمال کردم:
اما با بررسی دقیق تر متد on creat با استفاده از log و بدست آوردن زمان ، متوجه شدم کد :

کد:
setContentView(R.layout.ly);

بیشترین زمان رو صرف میکنه (حدود 1700ms) .
این یعنی مشکل از ساختار لایه ها و ویدجت های فایل xmlهست؟
(بوسیله Heirarchy viewer هم برنامه رو چک کردم دو سه تا از ویدجت ها draw time node قرمز نشون میده ولی هیچ جا نگفته چطور باید برطرف کرد)
با تشکر
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#7
کدهای فایل xml را نیز ذکر کنید.

Flower
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

ویجت های (widget) زیاد در layout (برنامه نویسی اندروید)

#8
کد:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <ImageView
       android:id="@+id/imageView5"
       android:layout_width="500dp"
       android:layout_height="700dp"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       android:src="@drawable/bkg" />

   <RelativeLayout
       android:id="@+id/wordsbtn_lyout"
       android:layout_width="300dp"
       android:layout_height="300dp"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true" >
       <Button
           android:id="@+id/button1"
           android:layout_width="100dp"
           android:layout_height="100dp"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="true"
           android:background="@drawable/buttonw"
           android:paddingBottom="15dp"
           android:soundEffectsEnabled="false"
           android:textColor="#612c0f"
           android:textSize="70sp" />
 </RelativeLayout>

   <TextView
       android:id="@+id/textView2"
       android:layout_width="150dp"
       android:layout_height="60dp"
       android:layout_alignParentRight="true"
       android:layout_alignParentTop="true"
       android:layout_marginRight="5dp"
       android:layout_marginTop="5dp"
       android:background="@drawable/dddd"
       android:gravity="center"
       android:maxLength="3"
       android:textColor="#ffffff"
       android:textSize="35sp" />

   <ImageView
       android:id="@+id/imageView12"
       android:layout_width="150dp"
       android:layout_height="50dp"
       android:layout_alignRight="@id/textView2"
       android:layout_below="@id/textView2"
       android:src="@drawable/sssss" />

   <TextView
       android:id="@+id/textViewc"
       android:layout_width="140dp"
       android:layout_height="60dp"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       android:layout_marginLeft="5dp"
       android:layout_marginTop="5dp"
       android:background="@drawable/ssss"
       android:gravity="right|center_vertical"
       android:paddingBottom="10dp"
       android:paddingRight="15dp"
       android:textColor="#ffe400"
       android:textSize="40sp" />

   <TextView
       android:id="@+id/textView5"
       android:layout_width="120dp"
       android:layout_height="60dp"
       android:layout_marginLeft="10dp"
       android:layout_marginTop="5dp"
       android:layout_toRightOf="@id/textViewc"
       android:background="@drawable/ssss"
       android:gravity="right|center_vertical"
       android:paddingBottom="10dp"
       android:paddingRight="15dp"
       android:textColor="#98e6fe"
       android:textSize="40sp" />

   <ImageView
       android:id="@+id/imageView6"
       android:layout_width="120dp"
       android:layout_height="120dp"
       android:layout_above="@id/lyout1"
       android:layout_centerHorizontal="true"
       android:layout_marginBottom="10dp" />

   <ImageView
       android:id="@+id/imageView7"
       android:layout_width="80dp"
       android:layout_height="80dp"
       android:layout_alignBottom="@+id/imageView5"
       android:layout_centerHorizontal="true"
       android:layout_marginBottom="10dp"
       android:src="@drawable/kkk" />

   <TextView
       android:id="@+id/textView3"
       android:layout_width="110dp"
       android:layout_height="60dp"
       android:layout_alignBottom="@+id/imageView9"
       android:layout_toLeftOf="@+id/imageView9"
       android:background="@drawable/ab"
       android:gravity="right|center_vertical"
       android:paddingRight="10dp"
       android:textColor="#bf6b36"
       android:textSize="35sp"
       android:visibility="invisible" />

   <ImageView
       android:id="@+id/imageView9"
       android:layout_width="60dp"
       android:layout_height="60dp"
       android:layout_alignParentBottom="true"
       android:layout_alignParentRight="true"
       android:layout_marginBottom="5dp"
       android:layout_marginRight="5dp"
       android:soundEffectsEnabled="false"
       android:src="@drawable/ab" />

   <Button
       android:id="@+id/button10"
       android:layout_width="110dp"
       android:layout_height="60dp"
       android:layout_alignParentBottom="true"
       android:layout_alignParentLeft="true"
       android:layout_margin="5dp"
       android:background="@drawable/buttona"
       android:soundEffectsEnabled="false"
       android:textColor="#612c0f"
       android:textSize="16sp"
       android:textStyle="bold" />

 <RelativeLayout
       android:id="@+id/layout2"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:background="@drawable/ddff"
       android:visibility="invisible" >
       <Button
           android:id="@+id/buttonnext"
           android:layout_width="110dp"
           android:layout_height="110dp"
           android:layout_alignParentBottom="true"
           android:layout_alignParentRight="true"
           android:layout_marginBottom="300dp"
           android:layout_marginRight="35dp"
           android:background="@drawable/dddd"
           android:soundEffectsEnabled="false" />
   </RelativeLayout>

   <TextView
       android:id="@+id/textView1"
       android:layout_width="180dp"
       android:layout_height="70dp"
       android:layout_alignParentTop="true"
       android:layout_centerHorizontal="true"
       android:layout_marginTop="170dp"
       android:background="@drawable/bs"
       android:drawableRight="@drawable/s"
       android:gravity="center"
       android:paddingRight="15dp"
       android:text="@string/ssss"
       android:textColor="#f27901"
       android:textSize="38sp"
       android:textStyle="bold"
       android:visibility="invisible" />
   
   <RelativeLayout
       android:id="@+id/layout3"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_alignParentBottom="true"
       android:layout_centerHorizontal="true"
       android:visibility="invisible" >
       <ImageView
           android:id="@+id/imageView10"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_centerHorizontal="true"
           android:layout_centerVertical="true"
           android:scaleType="fitXY"
           android:src="@drawable/aa" />
       <Button
           android:id="@+id/button7"
           android:layout_width="200dp"
           android:layout_height="250dp"
           android:layout_alignParentLeft="true"
           android:layout_centerVertical="true"
           android:layout_marginLeft="40dp"
           android:layout_marginTop="80dp"
           android:background="@drawable/ccccc"
           android:paddingRight="10dp"
           android:soundEffectsEnabled="false"
           android:textColor="#ffffff"
           android:textSize="25sp" />
       <Button
           android:id="@+id/button11"
           android:layout_width="200dp"
           android:layout_height="250dp"
           android:layout_alignParentRight="true"
           android:layout_centerVertical="true"
           android:layout_marginRight="40dp"
           android:layout_marginTop="80dp"
           android:background="@drawable/bbbb"
           android:soundEffectsEnabled="false" />
       <Button
           android:id="@+id/button8"
           android:layout_width="55dp"
           android:layout_height="55dp"
           android:layout_alignBottom="@+id/button11"
           android:layout_alignRight="@+id/button11"
           android:layout_marginBottom="250dp"
           android:background="@drawable/aaaa"
           android:soundEffectsEnabled="false" />
   </RelativeLayout>

</RelativeLayout>

با تشکر 
Idea
پاسخ
 سپاس شده توسط شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان