2014-10-28 50 views
11

我有一個主要活動,其中包含帶有3個菜單按鈕的操作欄。Android從其父級活動刷新片段列表

然後我在這個主要活動中有一個片段,它有一個列表。

我希望能夠從主活動中刷新片段中的列表,當單擊其中一個菜單按鈕時,或者最好只是從列表中刪除所有行。

任何幫助表示讚賞。

謝謝。

public class Favourite extends SherlockFragmentActivity { 

    ActionBar actionBar; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.favourite); 

     actionBar = getSupportActionBar(); 

     actionBar.setDisplayShowTitleEnabled(false); 

     BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.actionbar_bg); 
     bg.setTileModeX(TileMode.REPEAT); 
     getSupportActionBar().setBackgroundDrawable(bg); 

     getSupportActionBar().setIcon(R.drawable.favourite_title); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     ActionBar.Tab tabAll = actionBar.newTab(); 
     ActionBar.Tab tabfavs = actionBar.newTab(); 
     ActionBar.Tab tabhist = actionBar.newTab(); 
     tabAll.setText("all"); 
     tabfavs.setText("favs"); 
     tabhist.setText("hist"); 
     tabAll.setTabListener(new MyTabListener()); 
     tabfavs.setTabListener(new MyTabListener()); 
     tabhist.setTabListener(new MyTabListener()); 
     actionBar.addTab(tabAll); 
     actionBar.addTab(tabfavs); 
     actionBar.addTab(tabhist); 


     try{ 

     } 
     catch(Exception e) 
     { 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.actionbar_itemlist_favourite, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
       case R.id.history: 
        break; 
       case R.id.favourite: 
        Intent favAct = new Intent(this, Favourite.class); 
        startActivity(favAct); 
        break; 
       case R.id.delete: 
        ///I WANT TO BE ABLE TO REFRESH FRAGMENTLIST FROM HERE 
       } 
       return true; 
    } 

    } 

class MyTabListener implements ActionBar.TabListener { 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if(tab.getPosition()==0) 
     { 
      FavouriteAllWords frag = new FavouriteAllWords(); 
      ft.replace(android.R.id.content, frag); 

     } 
     else if(tab.getPosition()==1) 
     { 
      FavouriteFavWords frag = new FavouriteFavWords(); 
      ft.replace(android.R.id.content, frag); 

     } 
     else if(tab.getPosition()==2) 
     { 
      FavouriteHistWords frag = new FavouriteHistWords(); 
      ft.replace(android.R.id.content, frag); 
     } 
    } 

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

    } 

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

    } 

} 

////////////////////我的名單片段CLASS

public class FavouriteAllWords extends ListFragment { 

    ArrayAdapter<String> adapter; 

    List<String> stringOfFavWords; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
    { 
     adapter = new ArrayAdapter<String>( 
       inflater.getContext(), R.layout.row, stringOfFavWords); 
       setListAdapter(adapter); 

     return super.onCreateView(inflater, group, saved); 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
    } 

} 
+0

你請出示一些代碼,你做了什麼?以及您在操作欄中添加哪個按鈕 – 2014-10-28 11:01:03

+0

Biraj Zalavadia的答案是非常糟糕的設計方法。看到我對他的回答的評論。 – Squonk 2014-10-28 11:53:00

回答

20

您可以輕鬆地做到這一點使用接口

MainActivity.java

public class MainActivity extends Activity { 

    public FragmentRefreshListener getFragmentRefreshListener() { 
     return fragmentRefreshListener; 
    } 

    public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) { 
     this.fragmentRefreshListener = fragmentRefreshListener; 
    } 

    private FragmentRefreshListener fragmentRefreshListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     Button b = (Button)findViewById(R.id.btnRefreshFragment); 

     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(getFragmentRefreshListener()!=null){ 
        getFragmentRefreshListener().onRefresh(); 
       } 
      } 
     }); 


    } 


    public interface FragmentRefreshListener{ 
     void onRefresh(); 
    } 

} 

MyFragment.java

public class MyFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = null; // some view 

     /// Your Code 


     ((MainActivity)getActivity()).setFragmentRefreshListener(new MainActivity.FragmentRefreshListener() { 
      @Override 
      public void onRefresh() { 

       // Refresh Your Fragment 
      } 
     }); 


     return v; 
    } 
} 
+1

謝謝你,這只是做了伎倆。 – user1319668 2014-10-28 11:40:01

+1

這是完全錯誤的做事方式。一個'Fragment'應該永遠不會'知道'它所連接的'Activity'的類型。特別是,如果「Fragment」是自包含的且可重用的,那麼如何保證「Activity」已經定義了任何特定的接口?簡短的回答 - 它不能。 – Squonk 2014-10-28 11:50:00

+2

@ Squonk不要恐慌可能是朋友。仔細閱讀問題。他明確寫到我想從MainActivity.java中刷新片段。他沒有說他的片段是一般的。所以我發佈的答案與不是用於通用目的的問題有關。如果你有更好的方法,請發帖爭論。 – 2014-10-28 11:59:28

5
  • 只是讓你更新/刷新方法公開和呼叫它來自你的活動。

OR

  • 使用LocalBroadcastManager或EventBus從您的活動發送事件,並通過訂閱該事件的碎片 - 反應,因此並調用刷新/更新方法。
+0

爲了使用公共方法,'Fragment'不需要是'Activity'的內部類。只要'Activity'有一個對'Fragment'實例的引用,它就可以調用'Fragment'中的任何公共方法。 – Squonk 2014-10-28 11:04:03

+0

對!我的壞... – localhost 2014-10-28 11:05:30

0

當你點擊ActionBar的任何按鈕,然後調用接口來刷新ListFragment。因爲在java接口中用於互通。

0

Biraj Zalavadia的答案是100%正確的,你會打電話給使用接口的片段方法.... 此接口方法運行時沒有錯誤...

在MainActivity中使用以上oncreate private FragmentRefreshListener fragmentRefreshListener;

public FragmentRefreshListener getFragmentRefreshListener() { 
    return fragmentRefreshListener; 
} 

public void setFragmentRefreshListener(
     FragmentRefreshListener fragmentRefreshListener) { 
    this.fragmentRefreshListener = fragmentRefreshListener; 
} 

活動

private void refreshcall(String result2) { 
    // TODO Auto-generated method stub 
    if (getFragmentRefreshListener() != null) { 
     getFragmentRefreshListener().onRefresh(result2); 
    } 

} 

內,換上這需要片段

private FragmentRefreshListener fragmentRefreshListener; 

    public FragmentRefreshListener getFragmentRefreshListener() { 
     return fragmentRefreshListener; 
    } 

    public void setFragmentRefreshListener(
      FragmentRefreshListener fragmentRefreshListener) { 
     this.fragmentRefreshListener = fragmentRefreshListener; 
    }