(사용되지 않음) onOptionsItemSelected 조각이 호출되지 않음
편집 : 이 질문은 더 이상 사용되지 않는 셜록 작업 모음에 대한 것입니다. 이제 Android 지원 라이브러리를 대신 사용해야합니다.
표시 fragment
되는 공유라는 작업 표시 줄 메뉴 옵션을 추가 했지만 선택 이벤트가 포착되지 않습니다.
이렇게 추가합니다
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
MenuItem item = menu.add(0, 7,0, R.string.share);
item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
모두에서 캡처 시도 fragment
와 fragment activity
같은
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 7:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
startActivity(Intent.createChooser(share, "Share Text"));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
나는이 setHasOptionsMenu(true);
에 onCreate()
.
나에게도 같은 문제가 발생했습니다.
onMenuItemSelected 이벤트가 Fragment에서 호출되지 않았습니다.
검색된 Google은 솔루션을 찾을 수 없으며 FragmentActivity에 onMenuItemSelected 메서드를 추가해도 해결되지 않습니다.
마지막으로 http://developer.android.com/guide/topics/ui/actionbar.html을 참조하여 문제를 해결 하십시오.
참고 : Fragment 클래스의 onCreateOptionsMenu 콜백을 통해 프래그먼트에서 메뉴 항목을 추가 한 경우 사용자가 프래그먼트 항목 중 하나를 선택할 때 시스템은 해당 프래그먼트에 대해 각각의 onOptionsItemSelected () 메서드를 호출합니다. 그러나 액티비티는 먼저 이벤트를 처리 할 기회를 얻으므로 시스템은 프래그먼트에 대해 동일한 콜백을 호출하기 전에 액티비티에서 onOptionsItemSelected ()를 호출합니다.
즉, 액티비티의 onOptionsItemSelected ()에 해당 메뉴 항목 핸들러가없는 경우에만 조각의 onOptionsItemSelected ()가 호출됩니다.
다음과 같은 코드 ----- FragmentActivity 에서 R.action.add 에 대한 처리기를 제거합니다 .)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
popBackStack();
return true;
case R.id.action_search:
searchAction();
return true;
case R.id.action_logout:
userLogout();
return true;
//case R.id.action_add:
//return true;
default:
return super.onOptionsItemSelected(item);
}
}
Fragment의 R.action.add 처리기는 다음과 같습니다.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("onOptionsItemSelected","yes");
switch (item.getItemId()) {
case R.id.action_add:
add();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
마지막으로
setHasOptionsMenu(true);
Fragment의 onCreate 메서드에서
나는 같은 문제가 있었지만 마지막 단계를 요약하고 소개하는 것이 더 낫다고 생각합니다.
setHasOptionsMenu(true)
Fragment의onCreate(Bundle savedInstanceState)
메소드에 메소드를 추가하십시오 .onCreateOptionsMenu(Menu menu, MenuInflater inflater)
Fragment의onOptionsItemSelected(MenuItem item)
메서드 ( Fragment 메뉴에서 다른 작업을 수행하려는 경우) 및 메서드를 재정의 합니다 .Activity의
onOptionsItemSelected(MenuItem item)
메서드 내false
에서 메뉴 항목 작업이 Fragment의onOptionsItemSelected(MenuItem item)
메서드 에서 구현 될 때 반환해야합니다 .
예 :
활동
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Do Activity menu item stuff here
return true;
case R.id.fragment_menu_item:
// Not implemented here
return false;
default:
break;
}
return false;
}
파편
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Do something that differs the Activity's menu here
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Not implemented here
return false;
case R.id.fragment_menu_item:
// Do Fragment menu item stuff here
return true;
default:
break;
}
return false;
}
사람들이 당신에게 준 해결책은 프래그먼트가 아닌 액티비티의 메뉴 항목에 대한 코드를 구현하는 것입니다. 나는 당신이 코드를 조각에 구현했다면 훨씬 더 조직화되어 보일 것이라고 생각합니다. 이렇게하려면 다음과 같이하십시오.
활동
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.SomeIDInTheMenueOfTheActivity:
{
//something();
break;
}
default:
//do something default and add the code under :
return super.onOptionsItemSelected(item);
}
return true;
}
파편
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.SomeIDInFragmentMenue:
{
break;
}
default:
return super.onOptionsItemSelected(item);
}
return true;
}
Now the lines (and the likes): "return super.onOptionsItemSelected(item);" in the activity and fragment are super important, because as if you will follow the code in debug, you will see that the menue events functions will be called first on the Activity, and if the item did not match the id's in the activity's switch-case, the degault line : "super.onOptionsItemSelected(item);" will call the onOptionsItemSelected function on the fragment, as we wanted. (if you have many fragments, make sure to have that line in them as well, as the calling hirarchy can be somewhat complicated).
I'm using actionbarsherlock. This worked for me:
1) Create dummy_menu.xml menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
<item
android:title=""
android:showAsAction="never"
android:id="@+id/dummyMenu"
/>
2) In activity inflate the menu like this:
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.dummy_menu,menu);
return super.onCreateOptionsMenu(menu);
}
3) In fragments onCreateView call setHasOptionsMenu(true) and override onCreateOptionsMenu and onOptionsItemSelected also hide the dummyMenu like this (in fragment)
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_actions, menu);
MenuItem item = menu.findItem(R.id.dummyMenu);
item.setVisible(false);
super.onCreateOptionsMenu(menu, inflater);
}
Hope it helps someone.
Edit for actionbar sherlock use
I had to use
public boolean onMenuItemSelected(int featureId, MenuItem item) {
in the main activity to capture the menu item
it's so simple you can do that in your fragment to make sure that your action will listen correctly:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
I had this problem. It was because I was overiding the wrong method
onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) is what I used.
Make sure you are using the right one!
You are not chaining to the superclass in the activity methods. Please have onCreateOptionsMenu() return super.onCreateOptionsMenu(menu), and have onOptionsItemSelected() return super.onOptionsItemSelected(item) (except for the item that you are handling, which should return true to indicate that you have handled the event)
you must add this code toolbar.bringToFront();
next set toolbar in your activity
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
...
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle("Yazd");
setSupportActionBar(toolbar);
toolbar.bringToFront(); // <<= add here
...
'code' 카테고리의 다른 글
Laravel에서 현재 날짜, 시간, 요일 가져 오기 (0) | 2020.10.06 |
---|---|
Windows 클립 보드에 복사하는 cygwin 명령 (0) | 2020.10.06 |
신속하게 BODY로 POST 요청을 보내는 방법 (0) | 2020.10.06 |
TextInputLayout을 사용할 때 @ id / visible 리소스를 확인할 수 없습니다. (0) | 2020.10.06 |
Android-브로드 캐스트 수신기 onReceive ()에서 컨텍스트 가져 오기 (0) | 2020.10.06 |