راهنمایی درباره TabsPager(سوال مرتب شد)
سلام
دوستان اطلاعاتی که از سمت سرور دریافت می کنم توی یک اکتیویتی عادی نشان داده میشه ولی در فراگمنت نه .مشکل کجاست ؟چجوری باید فراخونی کنم اطلاعاتو توی فراگمنت ؟


کد های دو اکتیویتیم :
public class a_cat_tanz extends ListActivity {
String[] id, title;
String tid, ttitle;
private int page = 1;
private String res = "";
private int count;
private ProgressDialog pr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cat_tanz);
new getpost().execute();
}
private void makearray(int c) {
id = new String[c];
title = new String[c];
Arrays.fill(title, "");
}
public class getpost extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
pr = ProgressDialog.show(a_cat_tanz.this, "لطفا صبر کنید ...", "در حال دریافت اطلاعات از سرور");
}
@Override
protected Object doInBackground(Object... arg0) {
try {
String data = URLEncoder.encode("page", "utf8") + "=" + URLEncoder.encode(page + "", "utf8");
URL link = new URL("http://192.168.43.228/note/cat_tanz.php/");
URLConnection connect = link.openConnection();
//send data
connect.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(connect.getOutputStream());
wr.write(data);
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
res = sb.toString();
for (int y = 0; y < 4; y++) {
if (res.charAt(y) == '+') {
count = Integer.parseInt(res.substring(0, y));
res = res.substring(y + 1);
break;
}
}
makearray(count);
int f = 0, c = 0;
for (int i = 0; i < res.length(); i++) {
if (res.charAt(i) == '+') {
String temp = res.substring(f, i);
if (c == 0) {
tid = temp;
}
if (c == 1) {
ttitle = temp;
for (int t = 0; t < count; t++) {
if (title[t].equals("")) {
id[t] = tid;
title[t] = ttitle;
break;
}
}
c = -1;
}
f = i + 1;
c += 1;
}
}
}
catch (Exception e) {
res = e.toString();
}
return "";
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
pr.dismiss();
setListAdapter(new IA());
}
}
//fill list
class IA extends ArrayAdapter<String> {
public IA() {
super(a_cat_tanz.this, R.layout.row_main, title);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater in = getLayoutInflater();
View row = in.inflate(R.layout.row_main, parent, false);
TextView titr = (TextView) row.findViewById(R.id.row_main_titr);
titr.setText(title[position]);
return (row);
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class FragmentTanz extends android.support.v4.app.Fragment {
private View Layout;
public static Fragment instance(int catId) {
Fragment fragment = new FragmentTanz();
Bundle data = new Bundle();
data.putInt("catId", catId);
fragment.setArguments(data);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Layout = inflater.inflate(R.layout.cat_tanz, null);
return Layout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
}
دوستمون کدهای کامل رو نذاشته، توی فرگمنت یک متد instance هست که توی پارامتر های ورودیش catId رو میگیره، اونجا فرگمنت رو میسازه و این مقدار رو بهش پاس میده، ولی توی onCreate هیچ مقداری رو دریافت نکرده. برای گرفتن دیتا به این صورت عمل کنید.
if(getArguments() != null) {
int catId = getArguments().getInt("CAT_ID");
}
همونطوری که گفتم کد بالا باید توی onCreate یا onViewCreated نوشته بشه.
فقط مراقب باشید 1 بار بیشتر فرگمنت رو نسازید، چون دارید متد استاتیک رو کال میکنید نباید هنگام ساخت، new بکنید.
مثال:
getFragmentManager().beginTransaction()
.add(R.id.container, MyFragment.Instance(catId), "BILL_FRAGMENT")
.addToBackStack("MY_FRAGMENT")
.commit();
اگر میخواید چند تا متغیر ارسال کنید هم نیازی نیست چندین متغیر رو ارسال کنید. میتونید (طبق آموزش های استاد نام گذاری رو میگم تا بهتر متوجه بشید) یک کلاس به نام StructData بسازید به صورت زیر
public class StructData implements Serializable{
public int id;
public String text;
public String text2;
public String text3;
}
بعد هنگام ارسال از اکتیویتی به متد instance به جای int catId متغیری از نوع StructData بگیرید. هنگام ارسال از متد instance به فرگمنت هم به صورت زیر عمل کنید
bundle.putSerializable("DATA", data);
و برای گرفتنش در onCreate یا OnViewCreated به این صورت
StructData receivedData = (StructData) getArguments().getSerializable("DATA");
موفق باشید
حاج حسینی عزیز منظورتون از کد فراخوانی فرگمنت کد زیر است ؟
public class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(Context context, FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "List";
case 1:
return "test";
case 2:
return "tanz";
default:
return "tanz";
}
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragmentlist();
case 1:
return new Fragmenttest();
case 2:
return FragmentTanz.instance(2);
default:
return new FragmentTanz();
}
}
@Override
public int getCount() {
return 3;
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .