2016-11-02 3 views
1

Незначительно новое для android, у меня в настоящее время возникают трудности с реализацией PopupMenu на моем ImageButton в фрагменте. В коде нет ошибок, эмулятор может успешно сработать, но после нажатия ImageButton всплывающее меню не отображается.Всплывающее меню в фрагменте не отображается

OneFragment.java

public class OneFragment extends Fragment { 

public OneFragment() { 
    // Required empty public constructor 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootview = inflater.inflate(R.layout.fragment_one, container,false); 

    ImageButton popupButton = (ImageButton)rootview.findViewById(R.id.chineseTelevision); 
    popupButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      PopupMenu popupMenu = new PopupMenu(getActivity().getApplicationContext(), v); 
      popupMenu.inflate(R.menu.menu_main); 
      popupMenu.show(); 
     } 
    }); 

    return inflater.inflate(R.layout.fragment_one, container, false); 
    } 
} 

После нанесения раствора Pavneet (который является правильным решением)

return rootview; 

я наткнулся на другую ошибку,

android.view.InflateException: Binary XML file line #17: Failed to resolve attribute at index 6: TypedValue{t=0x3/d=0x486 "res/drawable/ic_menu_moreoverflow_material.xml" a=1 r=0x10803d6} 

я обнаружил, что эта ошибка была вызвана android.support.v7.widget.PopupMenu.

У этой ссылки есть решение, но не объяснено, почему виджет вызвал проблему. Здесь Popup Menu in custom ListView

ответ

1

вам нужно вернуть rootview вместо нового одного

return inflater.inflate(R.layout.fragment_one, container, false); 

поэтому она должна быть

return rootview; 

return inflater.inflate(R.layout.fragment_one, container, false); будет создать и вернуть новый вид вместо, тот, который вы создали и, следовательно, новый не будет иметь никакого инициализированного объекта popupmenu внутри него

поэтому ваш код будет быть

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootview = inflater.inflate(R.layout.fragment_one, container,false); 

    ImageButton popupButton = (ImageButton)rootview.findViewById(R.id.chineseTelevision); 

    popupButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

     PopupMenu popupMenu = new PopupMenu(getActivity().getApplicationContext(), v); 
     popupMenu.inflate(R.menu.menu_main); 
     popupMenu.show(); 

    } 
    }); 
    return rootview; 
} 
+0

Спасибо за ваше объяснение, я больше понимаю, какой вид вернуться сейчас. Код выполнялся без каких-либо ошибок, но после нажатия кнопки ImageButton у меня есть эта ошибка. 'android.view.InflateException: двоичная строка XML-файла # 17: не удалось разрешить атрибут по индексу 6: TypedValue {t = 0x3/d = 0x486" res/drawable/ic_menu_moreoverflow_material.xml "a = 1 r = 0x10803d6} ' – wuck

+0

это что-то с ресурсами, я пробовал свой код и с моим решением, и он отлично работает, просто убедитесь, что у ваших файлов' theme' и 'menu xml' нет проблем, хотя кажется проблемой« темы »для меня, попробуйте очистить и run –

+1

После некоторых поисковых запросов, я узнал, что ошибка после вашего решения была проблемой виджета всплывающих окон. Вот ссылка [link] (http://stackoverflow.com/questions/27782846/popup-menu-in-custom-listview), если кто-то получит ту же проблему, что и я. Спасибо, Павленэ. – wuck

0

Для этой проблемы на самом деле я предлагаю вам управлять OnClick от деятельности, вы можете создать интерфейс, который позволяет распространяться через деятельность, чище.

Смежные вопросы