آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

YMSA  10 سال پیش  10 سال پیش
0 0

سلام

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

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

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

}

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

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

موفق باشید

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

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

 

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

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

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