ورود

View Full Version : مشکل با fragment در استفاده از دیتابیس آماده



hamedjj
یک شنبه 24 فروردین 1393, 23:32 عصر
سلام من با دیتابیس آماده کار میکنم
تو کلاس main که extends Activity شده هیچ مشکلی نداره و داده ها بر روی لیست ویو فراخوانی میشه
اما اگه به جای اکتیویتی از fragment استفاده کنم (extend fragment) تو دو تا خط گیر میده:
1 :
db = new MyDatabase(this);
2 :
listview.setAdapter(new MyAdapter(this, list));

تو هر دوتا میگه constructor را از MyDatabase(context) به MyDatabase(MainActivity) تغییر بده و تغییر هم میدی درست نمیشه
مشکل از کجاست؟

کد MainActivity با fragment :
public class MainActivity extends Fragment {

private Cursor list;
private MyDatabase db;
public ListView listview;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_main, container, false);


db = new MyDatabase(this);
list = db.getList();

listview = (ListView) rootView.findViewById(R.id.listView1);
listview.setAdapter(new MyAdapter(this, list));
listview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {

}
});

return rootView;
}
}

کد MainActivity با Activity :
public class MainActivity extends Activity {

private Cursor list;
private MyDatabase db;
public ListView listview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

db = new MyDatabase(this);
list = db.getList();

listview = (ListView) findViewById(R.id.listView1);
listview.setAdapter(new MyAdapter(this, list));
listview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {

}
});

}
}

#root#
یک شنبه 24 فروردین 1393, 23:35 عصر
بجای this از getActivity() استفاده بکنید ، درست میشه؟

poorman
یک شنبه 24 فروردین 1393, 23:40 عصر
مشکل دقیقا از همون this هست دیگه

فک میکنم چون فرگمنت خودش کانتکست نداره که با this به اون ارجاع داده بشه این خطا داده میشه
احتمالا getApplicationContext() کمک کنه

hamedjj
دوشنبه 25 فروردین 1393, 00:13 صبح
getApplicationContext که تو کدهاش وجود نداشت

getactivity() و rootview.getContext هم برنامه کرش شد.

logcat :
04-13 20:09:51.114: E/AndroidRuntime(1037): FATAL EXCEPTION: main
04-13 20:09:51.114: E/AndroidRuntime(1037): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.hamed.listview_dbtest/com.hamed.listview_dbtest.MainActivity}: java.lang.ClassCastException: com.hamed.listview_dbtest.MainActivity cannot be cast to android.app.Activity



com.hamed.listview_dbtest.MainActivity cannot be cast to android.app.Activity

#root#
دوشنبه 25 فروردین 1393, 06:50 صبح
خب تا جایی که میدونم fragment ها نیاز به یه host یا همون والد یا پدر یا ... دارن تا اجرا بشن یعنی تنهایی قابل اجرا شدن نیستن ، شما الان این رو چجوری اجرا میکنید؟ (به نظر میاد همین کلاس رو توی مانیفست بجای activity معرفی کردین) باید داخل یه fragmentActivity استفاده کنید ازش.

hamedjj
دوشنبه 25 فروردین 1393, 19:43 عصر
حالا چطور میشه تو navigation drawer ازش استفاده کرد
تو این مورد از fragment ها استفاده شده

private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new Main();
break;
case 1:
fragment = new Help();
break;
case 2:
fragment = new Help();
break;
case 3:
fragment = new Produce();
break;
case 4:
fragment = new AboutUs();
break;
default:
break;
}

if (fragment != null) {
FragmentManager fragmentmanager = getSupportFragmentManager();
fragmentmanager.beginTransaction().replace(R.id.co ntent_frame, fragment).commit();

// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}

#root#
دوشنبه 25 فروردین 1393, 19:48 عصر
من خودم کار نکردم بصوزت عملی ، ولی توی layout معمولا یه frame-layout میزارن و fragment میشینه روش! الان تو کدهای بالا با انتخاب یک گزینه یه fragment انتخاب میشه و جایگزین قبلی میشه.
کجاش نامفهومه؟

hamedjj
دوشنبه 25 فروردین 1393, 21:52 عصر
تو کلاس Help که از فراگمنت extends شده در کد بالا قرار داره
حالا که بخواهیم به جای fragment از fragmentActivity استفاده کنیم باید در کد بالا چی بنویسیم

؟؟؟؟

#root#
دوشنبه 25 فروردین 1393, 21:57 عصر
public class MainActivity extends FragmentActivity

hamedjj
دوشنبه 25 فروردین 1393, 22:56 عصر
public class MainActivity extends FragmentActivity

خوب اینو که میدونستم
بعدش چی؟

hamedjj
پنج شنبه 28 فروردین 1393, 02:22 صبح
چطور میشه یک کلاس activity یا fragmentActivity را در یک fragment نمایش داد؟

public class Help extends Fragment {

public Help(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.help, container, false);
return rootView;
}
}