我需要实现两个选项卡选项。 1)顶站2)我的站 我使用了tab主机的片段活动。 我知道应该使用actionbar但是根据psd我需要在底部显示tab选项,所以我使用了tabhost,因为我不知道如何在屏幕底部显示actionbar 它完成了。 在我的所有片段中,我正在调用Web服务并解析json响应并在lisview中安排响应。 我在片段的oncreaview中写了服务端通信代码。 我面临的问题是,当我从登录活动片段切换到我的片段活动时,oncreateview没有被调用,所以我的listview doe没有出现。 但是当我改变标签然后它的开始出现。 我把日志发现,当调用活动时,片段的oncreatview不会被调用。
这是fragmentActivity的代码: 现在我只使用了两个片段。
public class AwesomeActivityNew extends FragmentActivity implements
TabHost.OnTabChangeListener {
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap<String, TabInfo>();
private TabInfo mLastTab = null;
public class TabInfo {
private String tag;
private Class<?> clss;
private Bundle args;
private Fragment fragment;
TabInfo(String tag, Class<?> clazz, Bundle args) {
this.tag = tag;
this.clss = clazz;
this.args = args;
}
}
class TabFactory implements TabContentFactory {
private final Context mContext;
/**
*
* @param context
*/
public TabFactory(Context context) {
mContext = context;
}
/**
* (non-Javadoc)
*
* @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
*/
public View createTabContent(String tag) {
View v = new View(mContext);
return v;
}
}
/**
* (non-Javadoc)
*
* @see android.support.v.app.FragmentActivity#onCreate(android.os.Bundle)
*/
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Step : Inflate layout
setContentView(R.layout.maintab_new);
// Step : Setup TabHost
initialiseTabHost(savedInstanceState);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); // set
// the
// tab
// as
// per
// the
// saved
// state
}
}
/**
* (non-Javadoc)
*
* @see android.support.v.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)
*/
protected void onSaveInstanceState(Bundle outState) {
outState.putString("tab", mTabHost.getCurrentTabTag()); // save the tab
// selected
super.onSaveInstanceState(outState);
}
/**
*
* Step : Setup TabHost
*/
private void initialiseTabHost(Bundle args) {
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
TabInfo tabInfo = null;
AwesomeActivityNew.addTab(this, this.mTabHost, this.mTabHost
.newTabSpec("Tab2").setIndicator("Tab2 "),
(tabInfo = new TabInfo("Tab2", TopStation.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
AwesomeActivityNew.addTab(this, this.mTabHost, this.mTabHost
.newTabSpec("Tab3").setIndicator("My station", getResources().getDrawable( R.drawable.star )),
(tabInfo = new TabInfo("Tab3", MyStation.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
// Default to first tab
this.onTabChanged("Tab");
//
mTabHost.setOnTabChangedListener(this);
}
/**
*
* @param activity
*
* @param tabHost
*
* @param tabSpec
*
* @param clss
*
* @param args
*/
private static void addTab(AwesomeActivityNew activity, TabHost tabHost,
TabHost.TabSpec tabSpec, TabInfo tabInfo) {
// Attach a Tab view factory to the spec
tabSpec.setContent(activity.new TabFactory(activity));
String tag = tabSpec.getTag();
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
tabInfo.fragment = activity.getSupportFragmentManager()
.findFragmentByTag(tag);
if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
FragmentTransaction ft = activity.getSupportFragmentManager()
.beginTransaction();
ft.detach(tabInfo.fragment);
ft.commit();
activity.getSupportFragmentManager().executePendingTransactions();
}
tabHost.addTab(tabSpec);
}
/**
* (non-Javadoc)
*
* @see android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String)
*/
public void onTabChanged(String tag) {
TabInfo newTab = (TabInfo) this.mapTabInfo.get(tag);
if (mLastTab != newTab) {
FragmentTransaction ft = this.getSupportFragmentManager()
.beginTransaction();
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(this,
newTab.clss.getName(), newTab.args);
ft.add(android.R.id.tabcontent, newTab.fragment, newTab.tag);
} else {
ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
ft.commit();
this.getSupportFragmentManager().executePendingTransactions();
}
}
}
这是Fragment的代码:
public class TopStation extends Fragment {
boolean jsonloadflag = false;
// int count = 0;
int currentpage = 0;
ListView ls;
JSONArray jsonarray;
Downloader downloader;
JSONLoader jsonloader;
MyCustomadapter adp;
int totalpages = 0;
TextView page;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// HttpClient client = new DefaultHttpClient();
// HttpPost post = new
// HttpPost("http://eluminoustechnologies.net/webapp/services/toptenstations.php");
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
if (!jsonloadflag) {
jsonloader = new JSONLoader();
jsonloader.execute(getActivity().getString(
R.string.web_root_service)
+ getActivity().getString(+R.string.TOPTEN_STATION_URL));
}
Log.e("onattach top station called","true");
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// count = 0;
//Log.e("oncreate view top station called","true");
// Inflate the layout for this fragment
// return inflater.inflate(R.layout.afragment, container, false);
Log.e("inside top station oncrateview","true");
currentpage = 0;
View v = inflater.inflate(R.layout.top_station, container, false);
ls = (ListView) v.findViewById(R.id.listview_topstation);
page = (TextView) v.findViewById(R.id.textView2);
/*
* View v1 = inflater.inflate(R.layout.footer_mystation, null);
* ls.addFooterView(v1);
*/
Button nextbtn = (Button) v.findViewById(R.id.btnnext);
Button previousbtn = (Button) v.findViewById(R.id.btnprevious);
new Downloader(currentpage).execute();
nextbtn.setClickable(false);
previousbtn.setClickable(false);
nextbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (currentpage < totalpages) {
new Downloader(currentpage).execute();
currentpage += 1;
page.setText("Page " + currentpage);
}
}
});
previousbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (currentpage > 1) {
new Downloader(currentpage).execute();
currentpage -= 1;
page.setText("Page " + currentpage);
}
}
});
return v;
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
class MyCustomadapter extends BaseAdapter {
ArrayList<HashMap<String, String>> data;
ArrayList<HashMap<String, Bitmap>> images;
public MyCustomadapter(ArrayList<HashMap<String, String>> ls,
ArrayList<HashMap<String, Bitmap>> listbitmap) {
this.data = ls;
this.images = listbitmap;
// this.data=imagename;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return images.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return data.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// Log.e("inside getview " + count, "true");
View row;
LayoutInflater inflater = getActivity().getLayoutInflater();
row = inflater.inflate(R.layout.list_row, null, false);
// grid=inflater.inflate(R.layout.gridrow, null);
ImageView stationimg = (ImageView) row
.findViewById(R.id.imageView1);
TextView stationname = (TextView) row.findViewById(R.id.textView1);
TextView description = (TextView) row.findViewById(R.id.textView2);
HashMap<String, String> map = data.get(position);
HashMap<String, Bitmap> imagemap = images.get(position);
stationname.setText(map.get("station_name"));
// Log.e("map data for desc", map.get("description"));
description.setText(map.get("description"));
if (imagemap.get("station_picture") != null)
stationimg.setImageBitmap(imagemap.get("station_picture"));
// stationimg.setBackgroundResource(dataimg[position]);
return (row);
}
}
private class Downloader extends AsyncTask<Void, Void, Void> {
int cpage = 0;
ProgressDialog dialog;
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
ArrayList<HashMap<String, Bitmap>> listbitmap = new ArrayList<HashMap<String, Bitmap>>();
public Downloader(int page) {
this.cpage = page;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog = new ProgressDialog(getActivity());
dialog.show();
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
adp = new MyCustomadapter(list, listbitmap);
ls.setAdapter(adp);
adp.notifyDataSetChanged();
Log.e("onPostExecute called", "true");
Log.e("size of data list", "" + list.size());
Log.e("size of data list", "" + listbitmap.size());
dialog.dismiss();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
Log.e("do inbackground downloader of downloader called", "true");
if (jsonloadflag) {
for (int j = cpage * 4; j < cpage * 4 + 4
&& j < jsonarray.length(); j++) {
HashMap<String, String> map = new HashMap<String, String>();
HashMap<String, Bitmap> imagemap = new HashMap<String, Bitmap>();
JSONObject jsonobj;
try {
jsonobj = jsonarray.getJSONObject(j);
String station_id = jsonobj.getString("station_id");
String station_name = jsonobj.getString("station_name");
String station_picture = jsonobj
.getString("station_picture");
String description = jsonobj.getString("description");
map.put("station_id", station_id);
map.put("station_name", station_name);
// map.put("station_picture", station_picture);
map.put("description", description);
String imageurl = getActivity().getResources()
.getString(R.string.web_root)
+ getActivity().getResources().getString(
R.string.station_image_path)
+ station_picture.replace(" ", "%20");
try {
URL url = new URL(imageurl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
Bitmap bmImg = BitmapFactory.decodeStream(is);
if (bmImg != null)
imagemap.put("station_picture", bmImg);
else {
Drawable myDrawable = getResources()
.getDrawable(R.drawable.ic_launcher);
Bitmap defaultimg = ((BitmapDrawable) myDrawable)
.getBitmap();
imagemap.put("station_picture", defaultimg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Log.e("station_id",station_id);
// Log.e("station_name", station_name);
// Log.e("station_picture",station_picture);
// Log.e("description", description);
// Log.e("counter is",""+count);
list.add(map);
listbitmap.add(imagemap);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// count += 5;
}
return null;
}
}
private class JSONLoader extends AsyncTask<String, Void, Void> {
JSONParser parser = new JSONParser();
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (jsonarray.length() > 0) {
page.setText("Page " + 1);
currentpage = 1;
}
}
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
Log.e("do in background of json loader called", "true");
if (!jsonloadflag) {
jsonarray = parser.getJSONarrayFromUrl(params[0]);
if (jsonarray.length() % 4 == 0)
totalpages = jsonarray.length() / 4;
else
totalpages = jsonarray.length() / 4 + 1;
// Log.e("url param", params[0]);
// Log.e("server side json", jsonarray.toString());
jsonloadflag = true;
}
return null;
}
}
}
请帮助我如何在我的片段活动开始时加载服务端数据时显示myfragment,其中包含标签主机和片段。
答案 0 :(得分:0)
你能更清楚地解释一下预期的行为是什么吗?我查看了你的代码,当片段被激活时,应该调用片段oncreateview,当活动开始时不会调用它。此外,从asynctask加载数据可能需要一些时间,您可能看不到结果。尝试使用服务器中较短的json数据字符串,或尝试从预加载的资产/原始文件中读取json。