首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android Studio - PopupMenu.OnMenuItemClickListener问题

Android Studio - PopupMenu.OnMenuItemClickListener问题
EN

Stack Overflow用户
提问于 2017-03-07 05:13:46
回答 3查看 6.1K关注 0票数 4

我正在编写一个移动应用程序,并通过该按钮的OnClick方法将弹出菜单附加到ImageButton。

代码语言:javascript
复制
    menu_lilac.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            showPopup(view);

        }
    });

我正在尝试让按下菜单项重定向到相关的活动(在末尾的switch语句中)。我得到的错误是Error:(23,8) error: MainActivity不是抽象的,并且不覆盖OnMenuItemClickListener中的抽象方法onMenuItemClick(MenuItem)。

代码语言:javascript
复制
public void showPopup(View view) {
    PopupMenu popup = new PopupMenu(this, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.mainmenu, popup.getMenu());
    MenuItem item = (MenuItem) popup.getMenu();
    popup.show();

    //Intent to Tasks Activity
    final Intent toTasks = new Intent(this, TasksActivity.class);

    //Intent to Distractions Activity
    final Intent toDist = new Intent(this, DistractionsActivity.class);

    //Intent to Settings Activity
    final Intent toSett = new Intent(this, SettingsActivity.class);

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.Home:
                    return true;

                case R.id.Tasks:
                    startActivity(toTasks);
                    return true;

                case R.id.Distractions:
                    startActivity(toDist);
                    return true;

                case R.id.Settings:
                    startActivity(toSett);
                    return true;

                default:
                    return false;
            }

    }

    });
}

我做错了什么?我尝试用一种不同的方式初始化OnMenuItemClickListener,比如

代码语言:javascript
复制
    PopupMenu.OnMenuItemClickListener listener = PopupMenu.OnMenuItemClickListener(){


    }

但listener从未使用过,当按下任何菜单按钮时,应用程序就会崩溃。

完整的MainActivity类:

代码语言:javascript
复制
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.NumberPicker;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ListView;

public class MainActivity extends Activity implements PopupMenu.OnMenuItemClickListener {

//Creation of used objects
//Button, Button, TextView, Handler, AlarmManager, NumberPicker, Pending Intent
//Context, TextView, Button

Button startButton;
Button stopButton;
TextView timerValue;
Handler customHandler = new Handler();
NumberPicker interval_length;
PendingIntent pending_intent;
Context context;
TextView checker;
ImageButton menu_lilac;
Intent toDist;
Intent toSett;
Intent toTasks;

//Creation of variables
long timeInMilliseconds = 0L;
long updatedTime = 0L;
long startTime = 0L;
int picked_value;
private static int minValueInterval = 1;
private static int maxValueInterval = 60;
int final_interval;

//On create function initialises the layout
@Override
protected void onCreate(Bundle savedInstanceState) {
    //Creation of main GUI layout
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.context = this;
}


@Override
protected void onStart() {
    super.onStart();

    //Initialise number picker
    interval_length = (NumberPicker) findViewById(R.id.interval_length);

    //Set minimum value (minutes)
    interval_length.setMinValue(minValueInterval);
    //Set maximum value (minutes)
    interval_length.setMaxValue(maxValueInterval);
    //Set currently displayed value (minutes)
    interval_length.setValue(20);

    //Initialise listener to listen for a value change on the number picker
    interval_length.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            //Replace variable picked_value with the new value of the number picker
        picked_value = interval_length.getValue() - 1;
        }
    });

    //Initialise timerValue text box
    timerValue = (TextView) findViewById(R.id.timerValue);

    //Initialise start button
    startButton = (Button) findViewById(R.id.startButton);

    //Initialise instance of stop button
    stopButton = (Button) findViewById(R.id.stopButton);

    //Initialise instance of menu button
    menu_lilac = (ImageButton) findViewById(R.id.menu_lilac);

    //Initialise checker text box
    checker = (TextView) findViewById(R.id.checker);

    //Menu button onClickListener
    menu_lilac.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            showPopup(view);

        }
    });

            //Start button OnClickListener
    startButton.setOnClickListener(new View.OnClickListener() {
        //On start begin counting up in milliseconds.
        //Reset timer every time Start button is pressed.
        public void onClick(View view) {
            timerValue.setText("00:00");
            startTime = SystemClock.uptimeMillis();
            customHandler.postDelayed(updateTimerThread, 0);

            //Set text box to print a message displaying when the alarm is for
            checker.setText("The alarm has been set for " + picked_value + " minutes from now!");

            //Make pop-up toast notification
            Toast.makeText(context,"Alarm on!", Toast.LENGTH_LONG).show();
        }
    });

    //Calculation of picked interval length (from minutes) to milliseconds
    final_interval = picked_value * 60 * 1000;
    if (timerValue.equals(picked_value+":00")) {
        alarm_manager.set(AlarmManager.RTC_WAKEUP, timeInMilliseconds, pending_intent);
    }

    //Initialise Stop button OnClickListener
    stopButton.setOnClickListener(new View.OnClickListener() {
        //On click stop updating timer thread and reset value to 00:00
        public void onClick(View view) {
            customHandler.removeCallbacks(updateTimerThread);
            timerValue.setText("00:00");

            //print message to notify user of alarm being cancelled
            checker.setText("The alarm has been cancelled!");
            //Make toast notification to say alarm cancelled
            Toast.makeText(context,"Alarm off!", Toast.LENGTH_LONG).show();
        }
    });
}
//Creates a runnable to update the timer
private Runnable updateTimerThread = new Runnable() {
    public void run() {
        //Takes time in milliseconds from the system clock
        timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
        updatedTime = timeInMilliseconds;
        //Converts milliseconds to seconds and minutes
        int secs = (int) (updatedTime / 1000);
        int mins = secs / 60;
        secs = secs % 60;
        int milliseconds = (int) (updatedTime % 1000);
        //Updates timerValue to the formatted 00:00 (minutes:seconds)
        timerValue.setText(String.format("%02d", mins) + ":"
                + String.format("%02d", secs));
        customHandler.postDelayed(this, 0);
    }
};

public Runnable showPopup(View view) {
    PopupMenu popup = new PopupMenu(this, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.mainmenu, popup.getMenu());
    MenuItem item = (MenuItem) popup.getMenu();
    popup.show();

    //Intent to Tasks Activity
    final Intent toTasks = new Intent(this, TasksActivity.class);

    //Intent to Distractions Activity
    final Intent toDist = new Intent(this, DistractionsActivity.class);

    //Intent to Settings Activity
    final Intent toSett = new Intent(this, SettingsActivity.class);

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.Home:
                    return true;

                case R.id.Tasks:
                    startActivity(toTasks);
                    return true;

                case R.id.Distractions:
                    startActivity(toDist);
                    return true;

                case R.id.Settings:
                    startActivity(toSett);
                    return true;

                default:
                    return false;
            }

    }

    });
}

}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-07 21:31:12

修复了!我从类声明中删除了"implements PopupMenu.OnMenuItemClickListener“,并重新做了一遍PopupMenu。这一次,我使用了if语句而不是switch语句,并且没有调用MenuInflater,而是在弹出窗口上使用了inflate()。

以下是所需的导入:

代码语言:javascript
复制
import android.view.MenuItem;
import android.widget.PopupMenu;

我的类声明:

代码语言:javascript
复制
public class MainActivity extends Activity {

以下是我的意图:

代码语言:javascript
复制
    //Intent to Tasks Activity
    final Intent toTasks = new Intent(this, TasksActivity.class);

    //Intent to Distractions Activity
    final Intent toDist = new Intent(this, DistractionsActivity.class);

    //Intent to Settings Activity
    final Intent toSett = new Intent(this, SettingsActivity.class);

这是我的弹出菜单。

代码语言:javascript
复制
   //Menu button onClickListener
    menu_lilac.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            //create instance of PopupMenu
            PopupMenu popup = new PopupMenu(getApplicationContext(), view);
            //inflate menu with layout mainmenu
            popup.inflate(R.menu.mainmenu);
            popup.show();

            //Set on click listener for the menu
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    if (item.getItemId()== R.id.Home){
                        Toast.makeText(context, "At home!", Toast.LENGTH_LONG).show();
                    }
                    if (item.getItemId() == R.id.Tasks){
                        startActivity(toTasks);
                    }
                    if (item.getItemId() == R.id.Distractions){
                        startActivity(toDist);
                    }
                    if (item.getItemId() == R.id.Settings){
                        startActivity(toSett);
                    }
                    return false;
                }
            });
        }
    });
票数 2
EN

Stack Overflow用户

发布于 2018-06-17 01:48:43

可能对迟到的访客有帮助

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {

ImageButton mainMenu;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainMenu = findViewById(R.id.ibtn_menu);

    mainMenu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showMenu(view);
        }
    });
}

 public void showMenu(View v) {
    PopupMenu popup = new PopupMenu(this, v);

    // This activity implements OnMenuItemClickListener
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.main_menue);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_day_view_about: {
            Toast.makeText(MainActivity.this,"Clicked on the action", Toast.LENGTH_LONG).show();
            return true;
        }
    }
    return true;
}
}
票数 0
EN

Stack Overflow用户

发布于 2019-04-12 16:02:17

我的问题是我实现了错误的OnMenuItemClickListener,

我需要:

代码语言:javascript
复制
PopupMenu.OnMenuItemClickListener

我有:

代码语言:javascript
复制
MenuItem.OnMenuItemClickListener
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42635677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档