我的活动延伸ActionBarActivity
。此活动使用ListFragment
显示数据。在此活动中,当用户点击MenuItem
时,我想在后台进行HTTP调用以获取一些数据,之后我需要更新ListFragment
。我需要知道如何从活动中更新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中一个经常出现的问题,并且想知道如何解决这个问题,以及在与Fragments交互时记录了哪些设计模式(如果有的话)。
请注意,我正在http://developer.android.com/reference/android/support/v4/app/ListFragment.html使用Android支持ListFragment
。 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
}
}
答案 0 :(得分:1)
您必须在onActivityCreated()
中实施Fragment
并从那里致电setHasOptionsMenu(true)
。然后覆盖onCreateOptionsMenu(MenuInflater, Menu)
中的Fragment
。并且记住onCreateOptionsMenu
在Activity
中实现时返回布尔值,但在Fragment
答案 1 :(得分:1)
确保从您的Activity中调用super.onOptionsItemSelected
,然后该方法将在您的片段上执行,您可以从片段中执行所有网络内容。
hiphopdroid解释了如何在Fragment中创建选项菜单。取决于您的应用程序可能更模块化。