在android中,活动如何与ListFragment通信?
我有一个扩展在android中,活动如何与ListFragment通信?,android,android-fragments,Android,Android Fragments,我有一个扩展ActionBarActivity的活动。此活动使用列表片段显示数据。在此活动中,当用户单击菜单项时,我想在后台执行HTTP调用以获取一些数据,之后,我需要更新列表片段。我需要知道如何从活动中更新ListFragment 布局XML的定义如下(代码段) ListFragment的代码如下所示 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt
ActionBarActivity
的活动。此活动使用列表片段显示数据。在此活动中,当用户单击菜单项时,我想在后台执行HTTP调用以获取一些数据,之后,我需要更新列表片段。我需要知道如何从活动中更新ListFragment
布局XML的定义如下(代码段)
ListFragment的代码如下所示
@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
}
}
@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
}
}
@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
}
}
我读过一篇SO帖子,上面说让列表片段
处理被点击的菜单项,但是当我在列表片段
中覆盖onoptionItemSelected(MenuItem)
时,似乎不起作用;我在该方法中设置了一个从未达到的断点
我确信这是Android中经常出现的问题,我想知道如何解决这个问题,以及在与片段交互方面有哪些设计模式(如果有)被记录在案
我只是想澄清一下,我正在使用Android支持ListFragment
at。还有另一个ListFragment
at,我没有使用它
感谢您的帮助
这是对我有效的解决方案
- 从
ActionBarActivity
中删除方法覆盖onCreateOptions菜单
- 从
ActionBarActivity
中删除方法覆盖onoptionItemSelected
然后在列表片段中执行以下操作
@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
}
}
@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
}
}
@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
}
}
您必须在片段中实现onActivityCreated()
,然后从那里调用设置选项菜单(true)
。然后覆盖片段中的onCreateOptions菜单(菜单展开器,菜单)
。记住onCreateOptions菜单
在活动
中实现时返回一个布尔值,但在片段
中实现时返回void。请确保从活动中调用super.onOptions ItemSelected
,然后该方法将在片段上执行,您可以执行所有网络操作从碎片上
hiphopdroid解释了如何从片段中创建选项菜单。取决于您的应用程序,它可能更加模块化。我已经根据您的建议修改了代码,但仍然不起作用。有几个问题。1) 我在哪里给菜单充气?在活动中
或列表片段中
?2) 如果活动
和列表片段
都覆盖了onoptionItemSelected(MenuItem项)
,这两种方法都会被调用吗?理想情况下,我只希望列表片段
处理所有代码(而不是活动
)。不过,谢谢,我根据您的建议做了一些修改,并使其正常工作。希望上面的代码片段也能帮助其他人澄清。@JaneWayne:1)在ListFragment
中为您的ListFragment
显示菜单。2) 如果onCreateOptions菜单()
在活动
以及列表片段
中实现,然后两个菜单
的菜单项
一起显示,即列表片段
的菜单项
添加到活动
的菜单项中super.onOptionsItemSelected
我在覆盖onOptionsItemSelected
时做的最后一件事是什么?尝试您建议的方法时,只有活动
的onoptionItemSelected
被触发(而不是列表片段
)。只是为了澄清,无论您是在活动中还是在片段中膨胀菜单,两者都可以响应菜单项。如果要重写活动中的OnOptions ItemSelected,则必须调用super方法以执行相应的片段方法。我的回答中肯定缺少的部分是在片段中调用SetHasOptions菜单,我认为这是不必要的,因为您在活动中而不是片段中膨胀菜单。不管怎样,在片段中做每件事都很好。