2013-02-28 4 views
1

Мне нужно реализовать две опции вкладки. 1) Верхняя станция 2) Моя станция Я использовал активность фрагментов с помощью узла вкладки. Я знаю, что нужно использовать панель действия, но в соответствии с psd мне нужно показать вкладку в нижней части, поэтому я использовал tabhost, так как не знаю, как показать панель действий внизу экрана. Все готово. В моем полном фрагменте я вызываю веб-службу и анализирую ответ json и устраиваю ответ в lisview. Я написал код связи стороны стороны внутри oncreaview фрагмента. Проблема, с которой я столкнулась, - это когда я swtich к активности моего фрагмента из фрагмента активности входа в oncreateview не вызывается, поэтому мой список не появляется. Но когда я сменил вкладку, появится ее начало. Я положил журнал и обнаружил, что oncreatview фрагмента не вызывается при вызове активности.фрагмент oncreateview не вызывается, когда начинается активность фрагмента

Вот код фрагментаАКТИВНОСТЬ: Сейчас я использовал только два фрагмента.

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

     } 


    } 
} 

Вот код фрагмента:

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

не могли бы вы более подробно объяснить, что такое ожидаемое поведение? Я просмотрел ваш код, и фрагмент oncreateview должен вызываться, когда фрагмент активирован, он не будет вызываться, когда начинается действие. Кроме того, для загрузки из асинтезы может потребоваться время, и вы можете не увидеть результат. Попробуйте использовать более короткую строку данных json с сервера или попробуйте прочитать json из предварительно загруженного ресурса/raw-файла.

+0

Привет, Когда я щелкнул еще одну вкладку и переключился на предыдущую вкладку, тогда данные loads.Data не загружаются только тогда, когда активирована активность. Начало запуска пустым, но когда я запускаю загрузку данных. –

Смежные вопросы