Java 如何使用按钮打开上下文菜单?

Java 如何使用按钮打开上下文菜单?,java,android,button,menu,onclick,Java,Android,Button,Menu,Onclick,我试图更改在应用程序中打开contextmenu的方式, 现在,要打开contextmenu,我需要长时间单击该项(在listview中),它可以正常工作。 我想改变这一点,在listview的每一行旁边添加一个按钮,单击该按钮,上下文菜单将打开 我在rawlayout.xml中添加了一个ImageButton(我现在看到了每行旁边的按钮),但是我无法从活动中获取该按钮。 当我尝试访问该按钮时,应用程序崩溃,并显示以下消息:java.lang.NullPointerException:尝试从空对

我试图更改在应用程序中打开contextmenu的方式, 现在,要打开contextmenu,我需要长时间单击该项(在listview中),它可以正常工作。 我想改变这一点,在listview的每一行旁边添加一个按钮,单击该按钮,上下文菜单将打开

我在rawlayout.xml中添加了一个ImageButton(我现在看到了每行旁边的按钮),但是我无法从活动中获取该按钮。 当我尝试访问该按钮时,应用程序崩溃,并显示以下消息:
java.lang.NullPointerException:尝试从空对象引用上的字段“android.widget.ImageButton com.grade.ido.grades.ListDataAdapter$layouthHandler.button”读取数据。

DataListActivity.java中发生的当前上下文菜单

更新2016年2月26日:我更新了相关代码:

package com.grade.ido.grades;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.InterstitialAd;
import java.text.DecimalFormat;
import java.util.Vector;

public class DataListActivity extends ActionBarActivity {
    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    com.grade.ido.grades.CourseDbHelper courseDbHelper;
    Cursor cursor;
    com.grade.ido.grades.ListDataAdaptar listDataAdaptar;
    Spinner sortSpinner;
    Spinner yearSpinner;
    Spinner semSpinner;
    ArrayAdapter<String> sortAdapter;
    ArrayAdapter<String> filterYearAdapter;
    ArrayAdapter<String> filterSemAdapter;
    private InterstitialAd mInterstitialAd;
    private String tempGradeOld,tempGradeNew;
    private String byYear,bySem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(com.grade.ido.grades.R.layout.update_course);
        hideActionBar();
        sortSpinner = (Spinner)findViewById(com.grade.ido.grades.R.id.sortSpinner);
        yearSpinner = (Spinner)findViewById(R.id.yearSpinner);
        semSpinner = (Spinner)findViewById(R.id.semSpinner);
        String[] sortItems = new String[]{"Sort by","Course name","Year","Semester", "Grade", "Points"};
        Vector<String> semItems = new Vector<>();
        semItems.add("all");
        sortAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, sortItems);
        filterYearAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, new  getData(getApplicationContext()).getYearItems());
        filterSemAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, semItems);
        sortSpinner.setAdapter(sortAdapter);
        semSpinner.setAdapter(filterSemAdapter);
        yearSpinner.setAdapter(filterYearAdapter);
        Bundle extras = getIntent().getExtras();
        bySem="all";
        byYear="all";
        courseDbHelper = new com.grade.ido.grades.CourseDbHelper(getApplicationContext());
        sqLiteDatabase = courseDbHelper.getReadableDatabase();
     //   System.out.println(extras.getString("SPINNER"));
        int spinnerPosition = sortAdapter.getPosition(extras.getString("SORT_SPINNER"));

       sortSpinner.setSelection(spinnerPosition);
        System.out.println("extrras data " + extras);
        if (extras==null){
            Log.e("DATALISTACTIVITY", "extras null");

        }
        else {
            Log.e("DATALISTACTIVITY", extras.toString());
        }
        TextView tAVR = (TextView) findViewById(R.id.avrAllCourse);
        double tempAvr = new getData(getApplicationContext()).getTaverage();
        int tempSum = new getData(getApplicationContext()).getSum();
        if (tempSum==0){
            tAVR.setText(Double.toString(0));
        }
        else {
            tAVR.setText(new DecimalFormat("##.##").format(tempAvr));
        }
        cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo._ID);
        sortSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (position == 0) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo._ID);
                    sortList(byYear,bySem);

                } else if (position == 1) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.COURSE);
                    sortList(byYear,bySem);
                }
                else if (position == 2) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.YEAR);
                    sortList(byYear,bySem);
                }
                else if (position == 3) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.SEMESTER);
                    sortList(byYear,bySem);
                }
                else if (position == 4) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.GRADE);
                    sortList(byYear,bySem);
                }
                else if (position == 5) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.POINTS);
                    sortList(byYear,bySem);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        listView = (ListView) findViewById(R.id.list_view);
        View header = getLayoutInflater().inflate(R.layout.header, null);
        listView.addHeaderView(header);
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("XXXXXXXXXXXXXXX");
        AdRequest adRequest = new AdRequest.Builder()
                .build();

        mInterstitialAd.loadAd(adRequest);
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }
        AdView mAdView = (AdView) findViewById(R.id.adView);

        mAdView.loadAd(adRequest);
    }
    public static int getLocationSpinner(String arr[], String a){
        int loc=-1;
        for (int i=0;i<arr.length;i++){
            if (arr[i].equals(a)){
                loc=i;
            }
        }
        return loc;
    }
    public void sortList(String byYear,String bySem){
        registerForContextMenu(listView);
        listDataAdaptar = new ListDataAdaptar(getApplicationContext(),R.layout.row_layout);
        listView.setAdapter(listDataAdaptar);
        ImageButton button= (ImageButton) findViewById(R.id.settingsButton);

        if (!cursor.moveToFirst()){
        }
        else {

            do {
                String year,semester,course,points,grade;
                year = cursor.getString(0);
                semester = cursor.getString(1);
                course = cursor.getString(2);
                points = cursor.getString(3);
                grade = cursor.getString(4);
                butt
                addTheCourse(year, semester, course, points, grade,button);
            }
            while (cursor.moveToNext());
        }

    }
    public void addTheCourse(String year,String semester,String course,String points,String grade,ImageButton but){
        DataProvider dataProvider = new DataProvider(year, semester, course, points, grade,but);
        listDataAdaptar.add(dataProvider);
    }
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflater = getMenuInflater();
        if (((AdapterView.AdapterContextMenuInfo)menuInfo).position == 0) {
            return;
        }
        inflater.inflate(R.menu.menu_data_list, menu);
        menu.setHeaderTitle("Options");
    }
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info =
                (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        final int mySelectedRowIndex = info.position-1;
        com.grade.ido.grades.DataProvider raw2 = (com.grade.ido.grades.DataProvider) listDataAdaptar.getItem(mySelectedRowIndex);

            switch (item.getItemId()) {
                case R.id.update_item:
                   //case 1 code .....
                    return true;
                case R.id.delete_item:
                   //case 2 code .....
                    return true;
                case R.id.change_grade:
                   //case 3 code .....
                    return super.onOptionsItemSelected(item);
            }

        }

    public void onBackPressed() {
        startActivity(new Intent(this, MainActivity.class));
    }

    private void hideActionBar() {
        //Hide the action bar only if it exists
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
    }
    }
我希望可以在DataListActivity.java中为listview中的每一行获取ImageButton。但是我得到了NullPointerException错误

如您所见,在DataListActivity的sortList函数中,我声明了imageButton(我也尝试在活动顶部声明,但得到了相同的null错误)

当我在ListDataAdapter中设置onclicklistner时,我可以访问listview中的每一行imageButton,并为每一行弹出不同的toast,但我无法创建新的contextmenu

是从onclick at listDataAdapter调用DataListActivity中的contextmenu的选项吗

这是我的DataListActivity.java:

package com.grade.ido.grades;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.InterstitialAd;
import java.text.DecimalFormat;
import java.util.Vector;

public class DataListActivity extends ActionBarActivity {
    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    com.grade.ido.grades.CourseDbHelper courseDbHelper;
    Cursor cursor;
    com.grade.ido.grades.ListDataAdaptar listDataAdaptar;
    Spinner sortSpinner;
    Spinner yearSpinner;
    Spinner semSpinner;
    ArrayAdapter<String> sortAdapter;
    ArrayAdapter<String> filterYearAdapter;
    ArrayAdapter<String> filterSemAdapter;
    private InterstitialAd mInterstitialAd;
    private String tempGradeOld,tempGradeNew;
    private String byYear,bySem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(com.grade.ido.grades.R.layout.update_course);
        hideActionBar();
        sortSpinner = (Spinner)findViewById(com.grade.ido.grades.R.id.sortSpinner);
        yearSpinner = (Spinner)findViewById(R.id.yearSpinner);
        semSpinner = (Spinner)findViewById(R.id.semSpinner);
        String[] sortItems = new String[]{"Sort by","Course name","Year","Semester", "Grade", "Points"};
        Vector<String> semItems = new Vector<>();
        semItems.add("all");
        sortAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, sortItems);
        filterYearAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, new  getData(getApplicationContext()).getYearItems());
        filterSemAdapter = new ArrayAdapter<String>(this, R.layout.my_spinner_textview, semItems);
        sortSpinner.setAdapter(sortAdapter);
        semSpinner.setAdapter(filterSemAdapter);
        yearSpinner.setAdapter(filterYearAdapter);
        Bundle extras = getIntent().getExtras();
        bySem="all";
        byYear="all";
        courseDbHelper = new com.grade.ido.grades.CourseDbHelper(getApplicationContext());
        sqLiteDatabase = courseDbHelper.getReadableDatabase();
     //   System.out.println(extras.getString("SPINNER"));
        int spinnerPosition = sortAdapter.getPosition(extras.getString("SORT_SPINNER"));

       sortSpinner.setSelection(spinnerPosition);
        System.out.println("extrras data " + extras);
        if (extras==null){
            Log.e("DATALISTACTIVITY", "extras null");

        }
        else {
            Log.e("DATALISTACTIVITY", extras.toString());
        }
        TextView tAVR = (TextView) findViewById(R.id.avrAllCourse);
        double tempAvr = new getData(getApplicationContext()).getTaverage();
        int tempSum = new getData(getApplicationContext()).getSum();
        if (tempSum==0){
            tAVR.setText(Double.toString(0));
        }
        else {
            tAVR.setText(new DecimalFormat("##.##").format(tempAvr));
        }
        cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo._ID);
        sortSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                if (position == 0) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo._ID);
                    sortList(byYear,bySem);

                } else if (position == 1) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.COURSE);
                    sortList(byYear,bySem);
                }
                else if (position == 2) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.YEAR);
                    sortList(byYear,bySem);
                }
                else if (position == 3) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.SEMESTER);
                    sortList(byYear,bySem);
                }
                else if (position == 4) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.GRADE);
                    sortList(byYear,bySem);
                }
                else if (position == 5) {
                    cursor = courseDbHelper.getInformation(sqLiteDatabase, com.grade.ido.grades.UserCourse.NewCourseInfo.POINTS);
                    sortList(byYear,bySem);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        listView = (ListView) findViewById(R.id.list_view);
        View header = getLayoutInflater().inflate(R.layout.header, null);
        listView.addHeaderView(header);
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("XXXXXXXXXXXXXXX");
        AdRequest adRequest = new AdRequest.Builder()
                .build();

        mInterstitialAd.loadAd(adRequest);
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }
        AdView mAdView = (AdView) findViewById(R.id.adView);

        mAdView.loadAd(adRequest);
    }
    public static int getLocationSpinner(String arr[], String a){
        int loc=-1;
        for (int i=0;i<arr.length;i++){
            if (arr[i].equals(a)){
                loc=i;
            }
        }
        return loc;
    }
    public void sortList(String byYear,String bySem){
        registerForContextMenu(listView);
        listDataAdaptar = new ListDataAdaptar(getApplicationContext(),R.layout.row_layout);
        listView.setAdapter(listDataAdaptar);
        ImageButton button= (ImageButton) findViewById(R.id.settingsButton);

        if (!cursor.moveToFirst()){
        }
        else {

            do {
                String year,semester,course,points,grade;
                year = cursor.getString(0);
                semester = cursor.getString(1);
                course = cursor.getString(2);
                points = cursor.getString(3);
                grade = cursor.getString(4);
                butt
                addTheCourse(year, semester, course, points, grade,button);
            }
            while (cursor.moveToNext());
        }

    }
    public void addTheCourse(String year,String semester,String course,String points,String grade,ImageButton but){
        DataProvider dataProvider = new DataProvider(year, semester, course, points, grade,but);
        listDataAdaptar.add(dataProvider);
    }
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflater = getMenuInflater();
        if (((AdapterView.AdapterContextMenuInfo)menuInfo).position == 0) {
            return;
        }
        inflater.inflate(R.menu.menu_data_list, menu);
        menu.setHeaderTitle("Options");
    }
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info =
                (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        final int mySelectedRowIndex = info.position-1;
        com.grade.ido.grades.DataProvider raw2 = (com.grade.ido.grades.DataProvider) listDataAdaptar.getItem(mySelectedRowIndex);

            switch (item.getItemId()) {
                case R.id.update_item:
                   //case 1 code .....
                    return true;
                case R.id.delete_item:
                   //case 2 code .....
                    return true;
                case R.id.change_grade:
                   //case 3 code .....
                    return super.onOptionsItemSelected(item);
            }

        }

    public void onBackPressed() {
        startActivity(new Intent(this, MainActivity.class));
    }

    private void hideActionBar() {
        //Hide the action bar only if it exists
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
    }
    }
行布局.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal">
    <TextView
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:id="@+id/textGrade"
        android:text="Grade"
        android:gravity="center"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:id="@+id/textPoints"
        android:text="Points"
        android:gravity="center"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:id="@+id/textCourse"
        android:text="Course"
        android:gravity="center"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:id="@+id/textSemester"
        android:text="Semester"
        android:gravity="center"
        android:textColor="#000000"/>
    <TextView
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:id="@+id/textYear"
        android:text="Year"
        android:gravity="center"
        android:textColor="#000000"/>
    <ImageButton
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:id="@+id/settingsButton"
        android:src="@drawable/settings"
        android:nestedScrollingEnabled="false" />
</LinearLayout>


我看不到您在ImageButton上添加侦听器的位置。另外,您没有将ImageButton添加到LayoutHandlerHi@sankyjain,从一开始我就添加了“空”代码,结果证明这是一个错误。现在我添加了相关的代码,并提供了我想要的更多细节。