2014-03-04 17 views
1

我想刷新片段取決於用戶在什麼抽屜...如何製作刷新抽屜中片段的Android刷新按鈕?

這是我的嘗試,它不會做任何事情,但不會給我一個錯誤。

這裏是我的代碼

public void fragmentRefresh() { 
     // Insert the fragment by replacing any existing fragment 
     FragmentManager fragmentManager = getFragmentManager(); 

      fragmentManager.beginTransaction() 
        .replace(R.id.frame_container, fragmentManager.findFragmentByTag("TagForRefresh")) 
        .commit(); 


    } 

這裏是抽屜片段代碼:

/** 
    * Diplaying fragment view for selected nav drawer list item 
    */ 
    private void displayView(int position) { 
     // update the main content by replacing fragments 
     Fragment fragment = null; 
     switch (position) { 
      case 0: 
       fragment = new HomeFragment(); 
       break; 
      case 1: 
       fragment = new BrowseFragment(); 
       break; 
      case 2: 
       fragment = new InviteFragment(); 
       break; 
      case 3: 
       fragment = new ProfileFragment(); 
       break; 
      case 4: 
       fragment = new SettingsFragment(); 
       break; 
      case 5: 
       callConfirmLogout(); 
       break; 


      default: 
       break; 
     } 

     if (fragment != null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.frame_container, fragment, "TagForRefresh").commit(); 

      // update selected item and title, then close the drawer 
      mDrawerList.setItemChecked(position, true); 
      mDrawerList.setSelection(position); 
      setTitle(navMenuTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } else { 
      // error in creating fragment 
      Log.e("MainActivity", "Error in creating fragment"); 
     } 

在標籤實現刷卡片段類:

public class ViewVotesActivity extends FragmentActivity implements ActionBar.TabListener{ 


    //Tab options 
    private ViewPager viewPager; 
    private TabSwipeAdapter mAdapter; 
    private ActionBar actionBar; 

    // Tab titles 
    private String[] tabs = { "Created", "Up", "Down"}; 
    //for custom menu to add progress bar to refresh 
    private MenuItem menuItem; 

    //Search view action bar 
    private SearchView search_action_bar; 

    //getApplicationContext().getString(R.string.created),getApplicationContext().getString(R.string.upvote), getApplicationContext().getString(R.string.downvote) 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_votes); 


     // Initializing tab 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabSwipeAdapter(getSupportFragmentManager(), new UserCreatedFragment(), new UserUpVotesFragment(),new UserDownVotesFragment()); 

     viewPager.setAdapter(mAdapter); 
     actionBar.setHomeButtonEnabled(true); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name) 
        .setTabListener(this)); 
     } 

     /** 
     * on swiping the viewpager make respective tab selected 
     * */ 
     /** 
     * on swiping the viewpager make respective tab selected 
     * */ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 


    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // on tab selected 
     // show respected fragment view 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.home, menu); 
     setupActions(menu); 
     callSearchActionBar(menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar actions click 
     switch (item.getItemId()) { 
      case R.id.action_refresh: 
       menuItem = item; 
       menuItem.setActionView(R.layout.refresh_progress_bar); 
       //menuItem.expandActionView(); 
       fragmentRefresh(); 

       TestTask task = new TestTask(); 
       task.execute("test"); 
       return true; 
      case R.id.action_discover: 
       addNewItem(); 
       return true; 
      case R.id.action_search: 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    public void addNewItem() { 
     // user redirect to register followup 
     Intent createItemIntent = new Intent(ViewVotesActivity.this, CreateItemActivity.class); 
     // Closing all the Activities 
     createItemIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     // Add new Flag to start new Activity 
     createItemIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     // Staring Login Activity 
     startActivity(createItemIntent); 
    } 

    public void fragmentRefresh() { 
//  // Insert the fragment by replacing any existing fragment 
//  FragmentManager fragmentManager = getFragmentManager(); 
// 
//  fragmentManager.beginTransaction() 
//    .replace(R.id.frame_container, fragmentManager.findFragmentByTag("TagForRefresh")) 
//    .commit(); 


    } 


    private class TestTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      // Simulate something long running 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      menuItem.collapseActionView(); 
      menuItem.setActionView(null); 
     } 
    }; 

    public void setupActions(Menu menu) { 
     MenuItem refreshItem = menu.findItem(R.id.action_refresh); 
     MenuItem discoverItem = menu.findItem(R.id.action_discover); 

     if (isAlwaysExpanded()) { 

     } else { 
      refreshItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM 
        | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

      discoverItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM 
        | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
     } 

    } 

    public void callSearchActionBar(Menu menu) { 
     //find the menu item and set search view at the same time 
     MenuItem searchItem = menu.findItem(R.id.action_search); 

     search_action_bar 
       = (SearchView) searchItem.getActionView(); 

     if (isAlwaysExpanded()) { 
      search_action_bar.setIconifiedByDefault(false); 
     } else { 
      searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM 
        | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
     } 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     if (searchManager != null) { 
      List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch(); 

      SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
      for (SearchableInfo inf : searchables) { 
       if (inf.getSuggestAuthority() != null 
         && inf.getSuggestAuthority().startsWith("applications")) { 
        info = inf; 
       } 
      } 
      search_action_bar.setSearchableInfo(info); 
     } 

     search_action_bar.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      public boolean onQueryTextChange(String newText) { 
       Log.e("Query = ", newText); 
       return false; 
      } 

      public boolean onQueryTextSubmit(String query) { 
       Log.e("Submit", "Submited " + query); 
       // user redirect to register followup 
       Intent searchIntent = new Intent(ViewVotesActivity.this, SearchActivity.class); 

       searchIntent.putExtra("search", query); 

       // Closing all the Activities 
       searchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

       // Add new Flag to start new Activity 
       searchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

       // Staring Login Activity 
       startActivity(searchIntent); 
       return false; 
      } 

      public boolean onClose() { 
       Log.e("query close", "query closingggg"); 
       return false; 
      } 
     }); 
    } 
    protected boolean isAlwaysExpanded() { 
     return false; 
    } 


} 
+0

我不明白...你想告訴片段更新其內容(無論是什麼)? –

+0

或者你想要替換屏幕上的片段? –

+0

我想片段刷新它的內容(更新)我認爲替換是用它自己的新版本更新它的方法 – Lion789

回答

1

UPDATE: 它看起來像你在試着g告訴一個Activity,現在是時候根據導航抽屜中的選擇改變內容片段。

此問題有兩個部分。

  1. 您需要提供一種機制,以便從抽屜與您的活動進行通信,然後該活動將繼續執行必要的操作。
  2. 你的碎片必須是分離,銷燬,重新創建和重新連接(無益,爲什麼?)或者簡單地實現一個機制,告訴他們:嘿,該刷新你的內容了。

我看不出有什麼理由需要徹底銷燬碎片的視圖,如果你只需要重置它的數據。看起來像一個設計缺陷。

替換片段並不意味着您想完全銷燬它,因爲用戶可以簡單地返回或按下最近刪除的片段。再次重新創建它將是低效的。

就像我在評論中提到的,需要更多的代碼來看看你目前的方法是什麼。

通常一個簡單的接口(就像我下面描述的接口)應該就足夠了。您的活動可以接收抽屜中的「點擊」並決定替換哪個片段(如果需要)。

請更具體一些,並提供更多的代碼。


舊響應:

警告:如果你想以取代目前的片段,請確保你沒有得到錯誤的FragmentManager。你做getFragmentManager(),但我相信你使用的支持庫,因此需要做getSupportFragmentManager();。 你沒有提及你的目標版本,所以很難知道。

在另一方面,

如果你想要做的是告訴當前可見的片段刷新...你應該用一種更常用的方法,以對象對對象的通信。

你過於複雜的事情。

(警告:僞代碼)

創建等的接口:

public interface Refreshable{ 
    void onShouldRefresh(); 
} 

有能夠存儲觀察家/聽衆的DrawerController ...

public class DrawerController { 
    private List<Refreshable> mListeners = new ArrayList<Refreshable>(); 
    public void addRefreshListener(E listener) { 
     if (listener != null && !mListeners.contains(listener)) { 
      mListeners.add(listener); 
     } 
    } 
    public void removeRefreshListener(E listener) { 
     if (listener != null) { 
      mListeners.remove(listener); 
     } 
    } 
} 

讓您的片段實現它(和當它們可見時訂閱事件)

public class HomeFragment extends Fragment implements Refreshable { 
    // your fragment code 
    public void onShouldRefresh(){ 
     // do the refresh 
    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     yourDrawerController.addRefreshListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     yourDrawerController.removeRefreshListener(this); 
    } 
} 

現在做的方法,會告訴當事人(在這種情況下,你的「刷新的」對象),它的時間來刷新,它添加到您的DrawerController ...

public void refresh(){ 
    for (Refreshable listener : mListeners) { 
     if (listener != null) { 
      listener.onShouldRefresh(); 
     } 
    }  
} 

最後,在你的代碼,調用refresh()並喝杯啤酒。

我想念你的觀點嗎?這對我來說不是100%清楚的。

+0

我的目標是api 14+,我喜歡你的想法,但現在試圖實現它,看看它是否作品,抽屜控制器是否也參與家庭活動?另外,家庭班的onShouldRefresh方法中的「刷新」是什麼? – Lion789

+0

DrawerController可以是任何你想要的單身人士或負責創建抽屜的人。 Refresh是否會在碎片中被調用。也許我誤解了你的問題? –

+0

嗯,只是試圖刷新每個片段,取決於哪一個是打開的......無論如何,我只是困惑於你的實現,你可以用我的代碼實現它,所以我可以明白髮生了什麼......我感謝你的幫助 – Lion789