我的活動延伸到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 ListFragment
在http://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)我在哪裏膨脹菜單?在「活動」或「ListFragment」中? 2)如果'Activity'和'ListFragment'都重寫'onOptionsItemSelected(MenuItem item)',那麼這兩個方法是否被調用?理想情況下,我只希望'ListFragment'處理所有代碼(而不是'Activity')。 –
沒關係,謝謝,我根據你的建議修改了一下,然後讓它工作。上面的代碼片段有助於澄清其他人。 –
@JaneWayne:1)在ListFragment中爲你的'ListFragment'膨脹你想要顯示的菜單。 2)如果'Activity'和'ListFragment'實現了'onCreateOptionsMenu()',那麼'Menu'的'MenuItem'一起顯示,即ListFragment的'MenuItem'是添加到Activity的'MenuItem'中。 – EdmDroid