بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

راهنمایی درباره TabsPager(سوال مرتب شد)

مدیریت گفتگو
YMSA 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام

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

کد های دو اکتیویتیم :

 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);

}

}

نظرات

Spirit 11 سال پیش
در حد توانم دیروز میخواستم راهنمایی کنم ولی سوالتون تمیز نیست + درج پاسخ بجای نظر.
YMSA 11 سال پیش
سوال مرتب شد ... ممنون میشم راهنمایی کنید تشکر
Spirit 11 سال پیش
الان بهتر شد، خب مشکل اینجاست که شما هنوز آشنایی کافی با Fragment ها رو ندارید چون اگر داشتید کدهای لازم برای دریافت و نمایش اطلاعات رو داخل کلاس Fragment هم مینوشتید. بهتره دوباره مطالعه کنید.
Hajhosseini 11 سال پیش
خوب شما دیتا رو توی instance گرفتی و به فرگمنت پاس دادی، حالا باید توی onCreate توی فرگمنت دیتارو بگیری و نمایش بدی دیگه. لزومی نداشت همه کدهارو قرار بدی، اگر دانلودر درست کار میکنه کدهاشو حذف کن، و بقیه چیزارو. فقط همین کدهای فرگمنتت کافی بود تا مشکل رو پیدا کنیم.
Spirit 11 سال پیش
حاج حسینی جان کجا به فرگمنت پاس دادن؟ من نمیبینم چرا؟
YMSA 11 سال پیش
بله متاسفانه آشنایی کافی با Fragment ها ندارم و مشکلم دقیقا همینجاست که چطوری کد های اکتیویتی را درون Fragment بنویسم ... ممنون Spirit جان حاج حسینی عزیز متوجه نشدم ...
Spirit 11 سال پیش
جستجوی فارسی انجام بدید آموزش فرگمنت کم و بیش پیدا میشه - به طور خلاصه: View ها رو توی متد onCreateView مقدار دهی کنید، بعد متد onViewCreated رو Override کنید و مثل Activity که ساختید AsyncTask رو اونجا صدا کنید - راه حل جناب حاج حسینی هم که هست - (برای ListAcitivity هم معادلی به اسم ListFragment داریم).
YMSA 11 سال پیش
مرسی اسپریت جان حتما جستجو می کنم ممنون از راهنمایتون

پاسخ‌ها 2

Hajhosseini 11 سال پیش

دوستمون کدهای کامل رو نذاشته، توی فرگمنت یک متد 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");

موفق باشید

نظرات

Spirit 11 سال پیش
خب این درست نیست جایی که لازمه کدها رو برداشته باشن و جایی که نیاز نیست کدها باقی بمونن، حالا ما به یه سوال خوب و کامل ممکنه جواب غلط بدیم وای به اینکه سوال خوب نباشه (وجود ابهام و ...). خب انگار شما هم با من موافقین D:
YMSA 11 سال پیش
مرسی دوست عزیز بابت راهنمایتون الان امتحان می کنم . ان شالله که حل میشه
Hajhosseini 11 سال پیش
کاملا درست میگی اسپریت جان، احتمالا میلاد عزیز یادشون رفته کد فراخوانی فرگمنت رو قرار بده. اگر مشکلتون حل شد اعلام کنید و بالای تاپیک یه حل شده بذارید تا دیگر دوستان هم بتونن راحت تر این تاپیک رو ببینن
YMSA 11 سال پیش

حاج حسینی عزیز منظورتون از کد فراخوانی فرگمنت کد زیر است ؟

 

 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;
}

}

نظرات

Hajhosseini 11 سال پیش
return FragmentTanz.instance(2); این قسمت منظورم بود، درست نوشتید.
YMSA 11 سال پیش
خب الان چجوری اکتیویتی که اطلاعات سرور را دریافت می کنه داخل فرگمنت فراخوانی کنم ؟ new getpost().execute();
Hajhosseini 11 سال پیش
بستگی داره برای چه کاری باشه، بعضی مواقع اصلا نباید اکتیویتی فراخوانی بشه، ولی برای دسترسی به اکتیویتی فقط کافیه توی فرگمنت بزنی getActivity ، این اکتیویتی رو بهت برمیگردونه بعد میتونی کستش کنی به اکتیویتی که میخوای و متدهای درون اکتیویتی رو صدا بزنی

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .