2014-11-22 42 views
0

我已經檢查了文檔中的更改和可能的修復,但是現在我得到的活動ComponentInfo錯誤與您提供的鏈接提供的新代碼有關。下面編輯的代碼。Android - 使用Fragment的SavedInstance發佈

MainActivity.java

public class TabMainActivity extends Activity { 

    ActionBar.Tab Tab1, Tab2, Tab3; 
    FragmentTab1 fragmentTab1 = new FragmentTab1(); 
    FragmentTab2 fragmentTab2 = new FragmentTab2(); 
    FragmentTab3 fragmentTab3 = new FragmentTab3(); 

    ArrayList<ListData> dataArray; 
    ListView listView; 
    ArrayList<DATA> data = new ArrayList<DATA>(); 
    private static String url = "http://80.240.142.93/nokta/casestudy.json"; 
    private static final String TAG_VIDEO = "videos"; 
    private static final String TAG_TITLE = "title"; 
    private static final String TAG_THUMB = "thumbnail"; 
    private static final String TAG_LINK = "video_url"; 
    private ArrayList<HashMap<String, String>> videosList; 
    Bundle bund = new Bundle(); 
    private Intent intent; 
    private JSONArray listArray; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     bund.putInt("love", 5); 
     fragmentTab1.setArguments(bund); 

     setContentView(R.layout.tabmainactivity); 


     videosList = new ArrayList<HashMap<String,String>>(); 
     if (isNetworkAvailable()){ 
      new JSONParse().execute(); 
     }else{ 
      showMessage("There is no internet connection"); 
     } 

     android.app.FragmentManager fm = getFragmentManager(); 
     android.app.FragmentTransaction ft = fm.beginTransaction(); 
     //ft.replace(R.id.fragment_container, fragmentTab1); 
     //ft.addToBackStack(null); 
     //ft.commit(); 


     ActionBar actionBar = getActionBar(); 

     // Hide Actionbar Icon 
     actionBar.setDisplayShowHomeEnabled(false); 

     // Hide Actionbar Title 
     actionBar.setDisplayShowTitleEnabled(false); 

     // Create Actionbar Tabs 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 


     Tab1 = actionBar.newTab().setText("TAB1").setTabListener(new TabListener<FragmentTab1>(this,"tab1",FragmentTab1.class)); 
     actionBar.addTab(Tab1); 
     Tab2 = actionBar.newTab().setText("TAB2").setTabListener(new TabListener<FragmentTab2>(this,"tab2",FragmentTab2.class)); 
     actionBar.addTab(Tab2); 
     Tab3 = actionBar.newTab().setText("TAB3").setTabListener(new TabListener<FragmentTab3>(this,"tab3",FragmentTab3.class)); 
     actionBar.addTab(Tab3); 


     //ListView listV = fragmentTab1.getListView(); 

    } 
    private class JSONParse extends AsyncTask<String, String, JSONObject> { 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

      } 
      @Override 
      protected JSONObject doInBackground(String... args) { 
      JSONParser jParser = new JSONParser(); 
      // Getting JSON from URL 
       JSONObject json = jParser.getJSONfromURL(url); 
       return json; 

      } 
      @Override 
       protected void onPostExecute(JSONObject json) { 
       try { 
       listArray = json.getJSONArray(TAG_VIDEO); 
       { 
        prepareData(json); 


       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      } 
       } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 
    private void showMessage(String txt){ 
     Toast.makeText(this, txt, Toast.LENGTH_LONG).show(); 
    } 
    private void prepareData(JSONObject json){ 

     try { 

     listArray = json.getJSONArray(TAG_VIDEO); 
     dataArray = new ArrayList<ListData>(); 
     for (int i = 0; i < listArray.length(); i++){ 
     // tmp hashmap for single contact 
     HashMap<String, String> video = new HashMap<String, String>(); 

     JSONObject c = listArray.getJSONObject(i); 
     String jpeg_s = c.getString(TAG_THUMB); 
     String title_s = c.getString(TAG_TITLE); 
     String video_s = c.getString(TAG_LINK); 

     video.put(TAG_THUMB, jpeg_s); 
     video.put(TAG_TITLE, title_s); 
     video.put(TAG_LINK, video_s); 

     videosList.add(video); 

     try { 
      URL newurl = new URL(jpeg_s); 
      Bitmap mIcon_val; 
      mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream()); 
      ListData prepare_data = new ListData(); 
      prepare_data.setImage(mIcon_val); 
      prepare_data.setName(title_s); 
      dataArray.add(prepare_data); 
      Log.e("BitMap", mIcon_val.toString()); 



     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
     //android.app.FragmentManager fm = getFragmentManager(); 
     //android.app.FragmentTransaction ft = fm.beginTransaction(); 
     //ft.replace(R.id.fragment_container, fragmentTab1); 
     //ft.addToBackStack(null); 
     //ft.commit(); 
     ListView lw = fragmentTab1.getListView(); 
     lw.setAdapter(new CustomAdapter(this, dataArray)); 

     } catch (JSONException e) { 
     e.printStackTrace(); 
     } 
     /* 
     listView.setAdapter(new CustomAdapter(this, dataArray)); 
     Log.e("LW", listView.getItemAtPosition(1).toString());*/ 


     Log.e("returnJSON", videosList.toString()); 
     } 


} 

TabListener.java

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 


    private Fragment mFragment; 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     String backStateName = mFragment.getTag(); 
     if (mFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      // If it exists, simply attach it in order to show it 
      ft.attach(mFragment); 
     } 
     Log.e("BAKSTAE", backStateName); 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      ft.detach(mFragment); 
     } 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 
} 

有人看到這個問題? 謝謝。

回答

1

問題在於,當您切換標籤頁時,您正在替換碎片,並且告訴Android您不再需要上一個片段。因此,當你切換回它時,它所擁有的數據已經消失。這裏

的文檔對如何實現你的TabListener一個很好的例子: http://developer.android.com/guide/topics/ui/actionbar.html#Tabs

在他們的榜樣,它們延遲實例化片段實例(而這創造了字段初始化所有的碎片像你正在做的)。然後,如果片段是新的,則它們調用ft.add,如果不是,則調用ft.attach。此外,當選項卡未被選中時,他們會呼叫ft.detach

+0

我已經試過,但問題發生。 – rencsaridogan 2014-11-23 11:52:58

+0

如果您從新的異常發佈堆棧,我會嘗試弄明白。確保發佈整個堆棧(可能有三個或四個連續的堆棧),並指出代碼中的哪一行崩潰。 – Bruce 2014-11-24 06:22:17

0

試試下面的代碼

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { 
    if (mMyView == null) { 
     mMyView = new MyView(getActivity()); 
    } else { 
     ((ViewGroup) mMyView.getParent()).removeView(mMyView); 
    } 

    return mPuzzleView; 
}