在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菜单,我认为这是不必要的,因为您在活动中而不是片段中膨胀菜单。不管怎样,在片段中做每件事都很好。