2013-08-29 2 views
1

한 번 열 : 안드로이드 4.1 메뉴에서OptionsMenu은 내가 팝업으로 optionsmenu를 열려면이 코드를 사용하고 안드로이드 4.1

@Override 
public boolean onPrepareOptionsMenu(Menu menu){ 
    openMenu(); 
    return true; 
} 

private void openMenu(){ 
    View popUpView = getLayoutInflater().inflate(R.layout.menu, null); 
    popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
             , LayoutParams.WRAP_CONTENT 
             , true); 
    popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
    popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
    popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
    makePopUpMenuButtons(popUpView); 
} 

문제는, 그 한 번만 엽니 다. invalidateOptionsMenu()에 대한 내용을 읽었으나이 메서드를 어디서 구현해야할지 모르겠습니다. 또한 이클립스는 "invalidateOptionsMenu() 메서드가 정의되지 않았습니다."라고 말합니다.

누구든지 메뉴 버튼을 클릭 할 때마다 옵션 메뉴가 열리도록해야 할 일을 알고 있습니까?

편집 :

난 사용자 정의 디자인을 가지고 싶어서, 안드로이드 메뉴 객체를 사용하지 마십시오. 그것이 내가 onPrepareOptionsMenu에서 popop을 만드는 이유입니다. 그래서 나는 onOptionsItemSelected를 사용하지 않는다. 내 문제는 onPrepareOptionMenu는 첫 번째 클릭 이후에만 불규칙적으로 호출된다는 것입니다.

Android 3.0 이상에서는 메뉴 항목이 작업 표시 줄에 표시 될 때 옵션 메뉴가 항상 열려있는 것으로 간주됩니다. 이벤트가 발생하여 메뉴 업데이트를 수행하려면 invalidateOptionsMenu()를 호출하여 시스템 호출 onPrepareOptionsMenu()를 요청해야합니다.

이 단락은 내 API가 3.0 이상일 때 invalidateOptionsMenu를 호출해야한다고 말합니다. 하지만 내 프로젝트에서는 4.1보다 낮은 API로 모든 것이 잘 동작합니다.

+0

있는지 모르겠어) onOptionsItemSelected() 또는 뭔가, 또는 적어도 우리에게 onOptionsItemSelected() 코드를 표시하십시오. – shkschneider

+0

저는 onOptionsItemSelected()를 사용하지 않습니다. 제 편집 – bluerob

답변

0

:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_MENU) { 
     openMenu(); 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

private void openMenu(){ 
    View popUpView = getLayoutInflater().inflate(R.layout.menu, null); 
    popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
             , LayoutParams.WRAP_CONTENT 
             , true); 
    popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
    popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
    popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
    makePopUpMenuButtons(popUpView); 
} 

하지만 난 당신이 invalidateOptionsMenu을 (사용한다고 생각 최상의 방법

1
@Override 
    public boolean onPrepareOptionsMenu(Menu menu){ 
     //You need to pass the menu to open menu method 
     openMenu(menu); 
     return true; 
    } 
    // 
    private void openMenu(Menu menu){ 
     //that menu can not be null 
     View popUpView = getLayoutInflater().inflate(R.layout.menu, menu); 
     popUpMenu = new PopupWindow(popUpView, LayoutParams.FILL_PARENT 
              , LayoutParams.WRAP_CONTENT 
              , true); 
     popUpMenu.setBackgroundDrawable(new BitmapDrawable()); 
     popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
     popUpMenu.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); 
     makePopUpMenuButtons(popUpView); 

} 

런타임에이 변경 메뉴 항목을 읽기 option menu

위의 링크에서 단락을보십시오 ... 내 팝업을 표시 한 후 invalidateOptionsMenu를 호출하려고했으나 방법이 정의되어 있기 때문에 일식, 오류를 제공합니다 두 번째 쿼리에 대한

편집 :

@Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // TODO Auto-generated method stub 

     menu.clear(); 

     menu.add(0, MENU_Unsubscribe, Menu.NONE, "Pop UP"); 

     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 

     if (item.getItemId() == MENU_Unsubscribe) { 
      View popUpView = getLayoutInflater().inflate(R.layout.activity_new, 
        null); 

      btnOK=(Button)popUpView.findViewById(R.id.btnOK); 



      popUpMenu = new PopupWindow(popUpView, 
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false); 
//   popUpMenu.setBackgroundDrawable 
      popUpMenu.setAnimationStyle(android.R.style.Animation_Dialog); 
      popUpMenu.showAtLocation(popUpView, Gravity.CENTER, 0, 0); 
      popUpMenu.setOutsideTouchable(true); 

      btnOK.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        popUpMenu.dismiss(); 
       } 
      }); 

     } 

     return super.onOptionsItemSelected(item); 
    } 
+0

을 읽으십시오. ClassCastError가 발생하면 다음과 같이하십시오./제 편집을 읽으십시오. – bluerob

+0

제 대답을 수정해야합니다. – Gru

+0

** 편집 : ** ** PopupWindow **'onPrepareOptionMenu()'를 추가하려는 이유, Popupwindow를 시도한 다음 [link] (http://www.pavanh.com/2013/05/android -popup-menu-example.html) – Gru

3

다음은 일을 더 명확하게됩니다

1의 onCreateOptionsMenu()를

이 활동에 대한 옵션 메뉴를 지정하려면 onCreateOptionsMenu() 우선합니다. 이 방법에서는 메뉴 리소스 (XML로 정의 됨)를 콜백에 제공된 메뉴로 확장 할 수 있습니다. Android 2.3.x and lower의 경우 사용자가 메뉴를 처음 열 때 옵션 메뉴를 만들기 위해 시스템에서 onCreateOptionsMenu()을 호출합니다. 그러나 Android 3.0 and higher의 경우, 작업 표시 줄에 항목을 표시하기 위해 활동을 시작할 때 시스템에서 onCreateOptionsMenu()을 호출합니다.

시스템 호출 후 onCreateOptionsMenu()은 채우는 메뉴의 인스턴스를 유지하며 어떤 이유로 메뉴가 무효화되지 않는 한 onCreateOptionsMenu()을 다시 호출하지 않습니다. 그러나 을 사용하여 초기 메뉴 상태를 만들고 활동 수명주기 동안 변경하지 않아야합니다.

2.onOptionsItemSelected()

옵션 메뉴에서 항목을 선택하면 시스템에서 활동의 onOptionsItemSelected() 메소드를 호출합니다. 이 메서드는 선택된 MenuItem을 전달합니다.

3. onPrepareOptionsMenu()는

당신은 활동 수명주기 동안 발생하는 이벤트에 따라 옵션 메뉴를 수정하려면

, 당신은 onPrepareOptionsMenu() 방법으로 수행 할 수 있습니다. 이 메소드는 Menu 객체를 현재 존재하는 그대로 전달하여 객체를 추가, 제거 또는 비활성화하는 등 수정할 수 있도록합니다.

Android 2.3.x and lower에서 사용자가 옵션 메뉴를 열 때마다 (메뉴 버튼을 누름) 시스템에서 onPrepareOptionsMenu()을 호출합니다.

Android 3.0 and higher에서 메뉴 항목이 작업 표시 줄에 표시되면 옵션 메뉴가 항상 열려있는 것으로 간주됩니다. 이벤트가 발생하고 메뉴 업데이트를 수행하려는 경우 invalidateOptionsMenu()으로 전화하여 시스템 호출 onPrepareOptionsMenu()을 요청해야합니다. 당신의 활동에 다음과 같은 이전 버전과의 호환성 추가에 대처하기 위해

: 따라서 onPrepareOptionsMenu()Refer this

다음과 같이 시도 할 수 있습니다 들어 invalidateOptionsMenu()Refer this

를 들어

.

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.Menu1: 
      refreshMenu(); 
      break; 
     case R.id.Menu2: 
      refreshMenu(); 
      break;  
     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void refreshMenu() { 
     if (Build.VERSION.SDK_INT >= 11) { 
      invalidateOptionsMenu(); 
     } 
    } 

할 수도 refer this이 코드는 내 문제를 해결

+0

나는 menuobject를 사용하지 않기 때문에 나는 onOptionsItemSelected를 사용하지 않습니다. 대신 나는 팝업 창이있다. 내 팝업 무시한 후 invalidateOptionsMenu() 넣으려고했으나 이클립스 메서드가 정의되어 있지 않습니다 말한다. – bluerob

+0

코드를 재구성 할 수 있으면 onCreateOptionsMenu() 및 invalidateOptionsMenu()를 사용하여 코드를 구현할 수 있으며 onPrepareOptionsMenu()가 필요하지 않습니다. –

관련 문제