Java 如何使用按钮打开上下文菜单?
我试图更改在应用程序中打开contextmenu的方式, 现在,要打开contextmenu,我需要长时间单击该项(在listview中),它可以正常工作。 我想改变这一点,在listview的每一行旁边添加一个按钮,单击该按钮,上下文菜单将打开 我在rawlayout.xml中添加了一个ImageButton(我现在看到了每行旁边的按钮),但是我无法从活动中获取该按钮。 当我尝试访问该按钮时,应用程序崩溃,并显示以下消息:Java 如何使用按钮打开上下文菜单?,java,android,button,menu,onclick,Java,Android,Button,Menu,Onclick,我试图更改在应用程序中打开contextmenu的方式, 现在,要打开contextmenu,我需要长时间单击该项(在listview中),它可以正常工作。 我想改变这一点,在listview的每一行旁边添加一个按钮,单击该按钮,上下文菜单将打开 我在rawlayout.xml中添加了一个ImageButton(我现在看到了每行旁边的按钮),但是我无法从活动中获取该按钮。 当我尝试访问该按钮时,应用程序崩溃,并显示以下消息:java.lang.NullPointerException:尝试从空对
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,从一开始我就添加了“空”代码,结果证明这是一个错误。现在我添加了相关的代码,并提供了我想要的更多细节。