2014-05-05 36 views
1

我的活動延伸到ActionBarActivity。此活動使用ListFragment顯示數據。在此活動中,當用戶單擊MenuItem時,我想在後臺執行HTTP調用以獲取一些數據,之後,我需要更新ListFragment。我需要知道如何從活動更新ListFragment活動如何與android中的ListFragment進行通信?

佈局XML定義如下(片段)。

<RelativeLayout ...> 
    <fragment android:id="@+id/browse class="x.y.z.CustomListFragment"/> 
</RelativeLayout> 

活動的Java代碼如下所示。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.browser); 
} 

@Override 
protected boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.main, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    MenuItem miActionSearch = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView)miActionSearch.getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(R.id.refresh == item.getItemId()) { 
     //logic to fetch data and refresh ListFragment goes here 
    } 
} 

ListFragment的代碼如下所示。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
setHasOptionsMenu(true); 
} 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
super.onCreateOptionsMenu(menu, inflater); 
//do i need to inflate here again? 
//inflater.inflate(R.menu.main, menu); 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
if(R.id.refresh == item.getItemId()) { 
    //do asynchronous data fetching task here 
} 
} 

我讀的SO職位,說讓ListFragment處理菜單項被點擊,但是當我重寫onOptionsItemSelected(MenuItem)ListFragment裏面,似乎不工作;我在該方法中放置了一個永不會達到的斷點。

我相信這是Android的一個普遍問題反覆出現,並想知道如何解決這個問題,什麼設計模式,如果有的話,是有文件規定與片段互動。

只是爲了澄清,我使用的是支持Android ListFragmenthttp://developer.android.com/reference/android/support/v4/app/ListFragment.html。在http://developer.android.com/reference/android/app/ListFragment.html有另一個ListFragment,我沒有使用。

任何幫助表示讚賞。

這裏是爲我工作的解決方案。從ActionBarActivity

  • 除去方法重寫onCreateOptionsMenu
  • ActionBarActivity去除方法重寫onOptionsItemSelected

然後內部的ListFragment執行以下操作。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
setHasOptionsMenu(true); 
} 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
super.onCreateOptionsMenu(menu, inflater); 
inflater.inflate(R.menu.main, menu); 
//any additional code here, like setting up the searching feature 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
if(R.id.refresh == item.getItemId()) { 
    //... logic 
} 
} 

回答

1

你必須實現在FragmentonActivityCreated(),並從那裏調用setHasOptionsMenu(true)。然後覆蓋Fragment中的onCreateOptionsMenu(MenuInflater, Menu)。請記住onCreateOptionsMenu返回布爾在Activity實現,但在Fragment

+0

我已經修改了您的建議的代碼,但它仍然無法正常工作。幾個問題。 1)我在哪裏膨脹菜單?在「活動」或「ListFragment」中? 2)如果'Activity'和'ListFragment'都重寫'onOptionsItemSelected(MenuItem item)',那麼這兩個方法是否被調用?理想情況下,我只希望'ListFragment'處理所有代碼(而不是'Activity')。 –

+0

沒關係,謝謝,我根據你的建議修改了一下,然後讓它工作。上面的代碼片段有助於澄清其他人。 –

+0

@JaneWayne:1)在ListFragment中爲你的'ListFragment'膨脹你想要顯示的菜單。 2)如果'Activity'和'ListFragment'實現了'onCreateOptionsMenu()',那麼'Menu'的'MenuItem'一起顯示,即ListFragment的'MenuItem'是添加到Activity的'MenuItem'中。 – EdmDroid

1

實施時請務必打電話給super.onOptionsItemSelected從您的活動,然後該方法將在你的片段來執行,你可以從做所有的網絡的東西返回void時片段。

hiphopdroid解釋瞭如何您還可以在片段中創建選項菜單。取決於可能更加模塊化的應用程序。

+0

'super.onOptionsItemSelected'是我在'onOptionsItemSelected'重寫中做的最後一件事情嗎?在嘗試使用您所建議的方法時,只會觸發Activity的'onOptionsItemSelected'(而不是'ListFragment')。 –

+0

只是爲了澄清,無論您是在活動中還是在片段中充氣菜單都無所謂,兩者仍然可以響應菜單項。如果你在Activity中覆蓋onOptionsItemSelected,那麼你必須調用super方法來執行相應的Fragment方法。我的答案中必須缺失的部分是在Fragment中調用setHasOptionsMenu,我不認爲這是必要的,因爲您在Activity中而不是在Fragment中爲菜單充氣。無論如何,你都可以很好地處理碎片中的任何事情。 – darnmason

相關問題