如何在活动之前调用片段onOptionsItemSelected?

时间:2013-04-11 10:31:54

标签: android actionbarsherlock

我在我的应用中使用 SlidingMenu 实现,我想要 android.R.id.home 按钮来打开/关闭侧边菜单。在Activity中我使用Fragment来显示信息。我希望主页按钮充当后退按钮。

问题是,在片段之前调用Activity中的 Activity的onOptionsItemSelected 。这是普通的行为吗?或者我做错了什么?

我也在我的项目中使用ActionBarSherlock,但我认为这并不重要。

在这里实现我自己的界面是唯一的解决方案吗?

2 个答案:

答案 0 :(得分:1)

昨晚我正在努力解决这个问题,但最终设法解决了,所以这是我的解决方案: 这些是MainActivity的相关部分:

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class MainActivity extends SherlockFragmentActivity {
.
.
.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        return super.onOptionsItemSelected(item);
    }

}

这是我的菜单main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>

</menu>

这是我的片段:

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

public class TestFrag extends SherlockFragment {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .
        .
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.add(Menu.NONE, android.R.id.home, 100, "Home");
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId())
        {
        case android.R.id.home:
//            Do whatever you want when Home is clicked.
            Toast.makeText(getSherlockActivity(), "Home is clicked", Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

这是我得到的: Menu items from both the parent activity and the fragment.

我希望这会有所帮助。

答案 1 :(得分:0)

结束将onOptionsItemSelected从Activity移动到我的基础Fragment类。

在基本片段类中,我有以下内容:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()){
        case android.R.id.home:
            // Toggle slide menu
            getBaseActivity().getSlidingMenu().toggle(true);
            break;
    }
    return super.onOptionsItemSelected(item);
}

protected boolean useHomeAsBack(MenuItem item){
    switch(item.getItemId()){
        case android.R.id.home:
            Log.v(TAG, "useHomeAsBack - onOptionsItemSelected");
            getSherlockActivity().onBackPressed();
            return true;
    }
    return false;
}

也可以在setHasOptionsMenu(true);内拨打onAttach

在我想要使用的实际片段中,我有:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(useHomeAsBack(item)) return true;
    return super.onOptionsItemSelected(item);
}

但是,我希望Fragment的onOptionsItemSelected能够覆盖或优先于Activity。不知道原因是什么。