从我的 MainActivity 调用方法
Calling a method from my MainActivity
我拼命尝试了 Internet 上的所有方法,以便能够调用我的
thisIsAMethodJustToTryOutMyButton(View view)
,当用户单击我的 Delete Button
MainActivity 时,但没有任何效果。按钮没有反应。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
适配器class
public class Adapter extends BaseAdapter{
private ArrayList<item> items= new ArrayList<>();
public void addItemToListView(Item item){
this.items.add(item);
}
public void deleteItem(int position){
items.remove(position);
}
@Override
public Item getItem(int position) {
return items.get(position);
}
@Override
public long getIdOfItem(int position) {
return position;
}
@Override
public int getCount() {
return items.size();
}
class ViewHolder {
public TextView title, content;
public ViewHolder(View view){
title= (TextView) view.findViewById(R.id.title);
content= (TextView) view.findViewById(R.id.content);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(null == convertView){
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.custom_row, parent, false);
viewHolder = new ViewHolder(convertView);
viewHolder.header.setTag(position);
convertView.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
Item item= getItem(position);
viewHolder.header.setText(item.title);
viewHolder.bodyText.setText(item.content);
return convertView;
}
}
MyDialogForDeletingAItem class
public class MyDialogForDeletingAItem extends DialogFragment
implements View.OnClickListener {
Button delete;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.deleteDialog, null);
delete = (Button) view.findViewById(R.id.delete);
delete.setOnClickListener(this);
return view; }
@Override
public void onClick(View view) {
if (view.getId() == R.id.delete) {
MainActivity main = new MainActivity();
main.thisIsAMethodJustToTryOutMyButton(view, //This is where the problem is...
//I don't know what to pass in here);
}
MainActivityclass
public class MainActivity extends AppCompatActivity implements
AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {
Adapter adapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.ListView);
adapter= new Adapter();
listView.setAdapter(adapter);
listView.setOnItemLongClickListener(this);
listView.setOnItemClickListener(this);
public void longItemClick(View view) {
DialogFragment dialog = new MyDialogForDeletingAItem();
dialog.show(this.getSupportFragmentManager(), "MyDialogForDeletingAItem");
thisIsAMethodJustToTryOutMyButton(view);
}
public void deleteRow(int position){
adapter.delete(position);
adapter.notifyDataSetChanged();
}
public void thisIsAMethodJustToTryOutMyButton(View view, int position){
deleteRow(position);
Toast.makeText(MainActivity.this,"" + position, Toast.LENGTH_SHORT).show();
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DELETE"
android:id="@+id/delete"
android:clickable="true"
android:layout_alignTop="@+id/edit"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="102dp"
android:layout_marginEnd="102dp" />
at se.example.android.myapplication.MainActivity.thisIsAMethodJustToTryOutMyButton
(MainActivity.java:100)
at se.example.android.myapplication.DeleteAndEdit.onClick(DeleteAndEdit.java:45)
您的 deleteRow()
方法应将视图作为参数
public void deleteRow(View view)
public static final int onClick
Added in API level 4 Name of the method in this View's context to
invoke when the view is clicked. This name must correspond to a public
method that takes exactly one parameter of type View. For instance, if
you specify android:onClick="sayHello", you must declare a public void
sayHello(View v) method of your context (typically, your Activity).
Must be a string value, using '\;' to escape characters such as '\n'
or '\uxxxx' for a unicode character.
This may also be a reference to a resource (in the form
"@[package:]type:name") or theme attribute (in the form
"?[package:][type:]name") containing a value of this type.
在您的 MainActivity 中,您在哪里引用您的thisIsAMethodJustToTryOutMyButton
?尝试在 xml 文件
中添加 android:onClick="thisIsAMethodJustToTryOutMyButton"
在您的 onClick(View view)
方法上创建您的 MainActivity
的新实例,而您需要使用已加载的 activity 实例。
像这样打电话
@Override
public void onClick(View view) {
if (view.getId() == R.id.delete) {
((MainActivity) getActivity()).thisIsAMethodJustToTryOutMyButton(view);
}
我拼命尝试了 Internet 上的所有方法,以便能够调用我的
thisIsAMethodJustToTryOutMyButton(View view)
,当用户单击我的 Delete Button
MainActivity 时,但没有任何效果。按钮没有反应。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
适配器class
public class Adapter extends BaseAdapter{
private ArrayList<item> items= new ArrayList<>();
public void addItemToListView(Item item){
this.items.add(item);
}
public void deleteItem(int position){
items.remove(position);
}
@Override
public Item getItem(int position) {
return items.get(position);
}
@Override
public long getIdOfItem(int position) {
return position;
}
@Override
public int getCount() {
return items.size();
}
class ViewHolder {
public TextView title, content;
public ViewHolder(View view){
title= (TextView) view.findViewById(R.id.title);
content= (TextView) view.findViewById(R.id.content);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(null == convertView){
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.custom_row, parent, false);
viewHolder = new ViewHolder(convertView);
viewHolder.header.setTag(position);
convertView.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
Item item= getItem(position);
viewHolder.header.setText(item.title);
viewHolder.bodyText.setText(item.content);
return convertView;
}
}
MyDialogForDeletingAItem class
public class MyDialogForDeletingAItem extends DialogFragment
implements View.OnClickListener {
Button delete;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.deleteDialog, null);
delete = (Button) view.findViewById(R.id.delete);
delete.setOnClickListener(this);
return view; }
@Override
public void onClick(View view) {
if (view.getId() == R.id.delete) {
MainActivity main = new MainActivity();
main.thisIsAMethodJustToTryOutMyButton(view, //This is where the problem is...
//I don't know what to pass in here);
}
MainActivityclass
public class MainActivity extends AppCompatActivity implements
AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {
Adapter adapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.ListView);
adapter= new Adapter();
listView.setAdapter(adapter);
listView.setOnItemLongClickListener(this);
listView.setOnItemClickListener(this);
public void longItemClick(View view) {
DialogFragment dialog = new MyDialogForDeletingAItem();
dialog.show(this.getSupportFragmentManager(), "MyDialogForDeletingAItem");
thisIsAMethodJustToTryOutMyButton(view);
}
public void deleteRow(int position){
adapter.delete(position);
adapter.notifyDataSetChanged();
}
public void thisIsAMethodJustToTryOutMyButton(View view, int position){
deleteRow(position);
Toast.makeText(MainActivity.this,"" + position, Toast.LENGTH_SHORT).show();
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DELETE"
android:id="@+id/delete"
android:clickable="true"
android:layout_alignTop="@+id/edit"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="102dp"
android:layout_marginEnd="102dp" />
at se.example.android.myapplication.MainActivity.thisIsAMethodJustToTryOutMyButton
(MainActivity.java:100)
at se.example.android.myapplication.DeleteAndEdit.onClick(DeleteAndEdit.java:45)
您的 deleteRow()
方法应将视图作为参数
public void deleteRow(View view)
public static final int onClick
Added in API level 4 Name of the method in this View's context to invoke when the view is clicked. This name must correspond to a public method that takes exactly one parameter of type View. For instance, if you specify android:onClick="sayHello", you must declare a public void sayHello(View v) method of your context (typically, your Activity).
Must be a string value, using '\;' to escape characters such as '\n' or '\uxxxx' for a unicode character.
This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.
在您的 MainActivity 中,您在哪里引用您的thisIsAMethodJustToTryOutMyButton
?尝试在 xml 文件
android:onClick="thisIsAMethodJustToTryOutMyButton"
在您的 onClick(View view)
方法上创建您的 MainActivity
的新实例,而您需要使用已加载的 activity 实例。
像这样打电话
@Override
public void onClick(View view) {
if (view.getId() == R.id.delete) {
((MainActivity) getActivity()).thisIsAMethodJustToTryOutMyButton(view);
}