Activity如何与android中的ListFragment通信?

时间:2014-05-05 15:39:22

标签: android android-fragments

我的活动延伸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支持ListFragmenthttp://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
 }
}

2 个答案:

答案 0 :(得分:1)

您必须在onActivityCreated()中实施Fragment并从那里致电setHasOptionsMenu(true)。然后覆盖onCreateOptionsMenu(MenuInflater, Menu)中的Fragment。并且记住onCreateOptionsMenuActivity中实现时返回布尔值,但在Fragment

中实现时返回void

答案 1 :(得分:1)

确保从您的Activity中调用super.onOptionsItemSelected,然后该方法将在您的片段上执行,您可以从片段中执行所有网络内容。

hiphopdroid解释了如何在Fragment中创建选项菜单。取决于您的应用程序可能更模块化。