PDA

View Full Version : ذخیره Fragment در Navigation Drawer



slr560
پنج شنبه 13 آذر 1393, 22:58 عصر
سلام دوستان
من یه مشکلی دارم که واقعا اگه راه حلی واسش دارین حتما بگین چون واقعا گیر کردم
نویگیشن دراور برنامه من ۵تا آیتم داره که فرگمنت هستن . در واقع با کلیک روی هر آیتم فرگمنت مورد نظر Replace میشه با قبلی
مشکل اینجاست UI فرگمنت ها کمی سنگینه و باید ۱بار لود بشن و ذخیره بشن و دفعات بعدی اون فرگمنت ذخیره شده رو نشون بده .
متدی که برای replace کردن نوشتیم به صورت زیر هست. کدهای زیر یه اشکالی که داره اینه که هر دفه که کلیک میشه یه new میزنه و این باعث میشه دوباره فرگمنت از دوباره بارگیری بشه . من میخوام این فرگمنت ها رو یه جا ذخیره کنم. چجوریشو نمیدونم


@Override
public void onNavigationDrawerItemSelected(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new InfoFragment();
break;
case 1:
fragment = new ParentOtoFragment();
break;
case 2:
fragment = new ParentProFragment();
break;
case 3:
fragment = new SupportFragment();
break;
case 4:
fragment = new AboutFragment();
break;
}
if (fragment != null){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container,fragmen t).commit();
}
}

saeidpsl
جمعه 14 آذر 1393, 09:50 صبح
فکر کنم این (http://emuneee.com/blog/2013/01/07/saving-fragment-states/) بتونه کمکت کنه

#root#
جمعه 14 آذر 1393, 10:18 صبح
سلام دوستان
من یه مشکلی دارم که واقعا اگه راه حلی واسش دارین حتما بگین چون واقعا گیر کردم
نویگیشن دراور برنامه من ۵تا آیتم داره که فرگمنت هستن . در واقع با کلیک روی هر آیتم فرگمنت مورد نظر Replace میشه با قبلی
مشکل اینجاست UI فرگمنت ها کمی سنگینه و باید ۱بار لود بشن و ذخیره بشن و دفعات بعدی اون فرگمنت ذخیره شده رو نشون بده .
متدی که برای replace کردن نوشتیم به صورت زیر هست. کدهای زیر یه اشکالی که داره اینه که هر دفه که کلیک میشه یه new میزنه و این باعث میشه دوباره فرگمنت از دوباره بارگیری بشه . من میخوام این فرگمنت ها رو یه جا ذخیره کنم. چجوریشو نمیدونم

سلام ، اینجوری که شما میگیی مصرف حافظه بیشتر میشه، ولی الان فقط یک عدد Fragment مقیم تو حافظه دارین.

slr560
جمعه 14 آذر 1393, 10:21 صبح
سلام ، اینجوری که شما میگیی مصرف حافظه بیشتر میشه، ولی الان فقط یک عدد Fragment مقیم تو حافظه دارین.
مشکل میدونی کجاست؟ مشکل اینه وقتی روی آیتم نویگیشن کلیک میشه یکم مکس میکنه و گیر میکنه تا UI ساخته بشه . این زیاد جالب نیس
من میخوام فقط حداقل فقط دفه ی اول گیر کنه . دفعات بعد فرگمنت ذخیره شده رو نمایش بده. حرف شما درسته . ولی خب مجبورم دیگه

slr560
جمعه 14 آذر 1393, 10:26 صبح
فکر کنم این (http://emuneee.com/blog/2013/01/07/saving-fragment-states/) بتونه کمکت کنه


مرسی دوسا عزیز
فقط چنتا سوال
این onSaveInstanceState چه موقع فراخوانی میشه؟؟ باید خودم دستی فراخوانیش کنم؟

tux-world
جمعه 14 آذر 1393, 10:32 صبح
باید دستی خودت فراخونیش بکنی و اور رایدش بکنی

slr560
جمعه 14 آذر 1393, 10:35 صبح
باید دستی خودت فراخونیش بکنی و اور رایدش بکنی
اونو که میدونم عزیز. میگم چه موقعی فراخوانی میشه؟؟؟ باید خودم دستی مثلا بزارمش توی onCreate یا onCreateView یا اینکه فقط کافیه اورراید بشه و بقیه کارارو خوددش میکنه؟؟

slr560
جمعه 14 آذر 1393, 11:39 صبح
این تابع saveinstancestate یه ورودی فرگمنت داره. اخریش. اینو هر جوری مقدار میدم ارور میگیره

tux-world
جمعه 14 آذر 1393, 18:14 عصر
خوب ببین داخل onCreate و اینا که نمیتونی اور رایدش کنی عزیزم. یه مثال میزنم برات. این مثال وضعیت رو زمان چرخودن گوشی نگهداری میکنه:


public class MainActivity extends Activity
{

protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
System.out.println("TAG, onSavedInstanceState");

final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = text.getText();
outState.putCharSequence("savedText", userText);
}
protected void onRestoreInstanceState(Bundle savedState)
{
System.out.println("TAG, onRestoreInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = savedState.getCharSequence("savedText");
text.setText(userText);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String name = "5";

final TextView show = (TextView)findViewById(R.id.textView1);
Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener()
{

public void onClick(View v)
{
// TODO Auto-generated method stub

show.setText(name);

}
});
}
}

slr560
جمعه 14 آذر 1393, 18:28 عصر
خوب ببین داخل onCreate و اینا که نمیتونی اور رایدش کنی عزیزم. یه مثال میزنم برات. این مثال وضعیت رو زمان چرخودن گوشی نگهداری میکنه:


public class MainActivity extends Activity
{

protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
System.out.println("TAG, onSavedInstanceState");

final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = text.getText();
outState.putCharSequence("savedText", userText);
}
protected void onRestoreInstanceState(Bundle savedState)
{
System.out.println("TAG, onRestoreInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = savedState.getCharSequence("savedText");
text.setText(userText);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String name = "5";

final TextView show = (TextView)findViewById(R.id.textView1);
Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener()
{

public void onClick(View v)
{
// TODO Auto-generated method stub

show.setText(name);

}
});
}
}

بله عزیز میدونم نیمشه اور راید کرد. نگفتمم اور راید کردم . گفتم فراخوانی
مشکلی توی ‌ذخیره مقدار های String و int ندارم . فقط نمیتونم کل فرگمنت رو ذخیره کنم
توی متد putFragment یه ورودی داره که باید فرگمنتی که قصد ذخیره کردنشو داری بدی. اینو هر جوری مقدار میدم قبول نمیکنه

saeidpsl
جمعه 14 آذر 1393, 20:43 عصر
این سورس (http://s5.picofile.com/file/8155484500/slidingmenu.rar.html) میتونه کمکت کنه

slr560
شنبه 15 آذر 1393, 00:52 صبح
این سورس (http://s5.picofile.com/file/8155484500/slidingmenu.rar.html) میتونه کمکت کنه
بازم نشد . تا یه جاییشو رفتم جلو ولی نحوه ی پیاده سازیش کلی با من فرق داره
فکر کنم باید توی خوده کلاسای فرگمنت تک تک بیام با onSaveInstanceState فرگمنت رو ذخیره کنم و بعد توی یکی از متدهای onCretae یا onCreateView بازیابیش کنم. اصلا نمیدونم چجوری بنویسمش:ناراحت:

slr560
شنبه 15 آذر 1393, 13:23 عصر
دوستان ۷۰ ٪ اوکی شد
فقط یه مشکل هست. چجور میتونم وقتی فرگمنت onPause یا onStop شد متد onSaveInstanceState رو فراخوانی کنم؟ چون فقط در صورت چرخش صفحه این متد فراخوانی میشه.

slr560
پنج شنبه 20 آذر 1393, 01:25 صبح
کسی نیست مرا یاری کند؟ :ناراحت: