【问题标题】:Calling a method from my MainActivity从我的 MainActivity 调用方法
【发布时间】:2016-08-12 09:52:33
【问题描述】:

我已经拼命尝试了互联网上的一切,以便能够打电话给我的 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

适配器类

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 类

 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);
}

MainActivity 类

 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)

【问题讨论】:

    标签: android button methods onclick android-dialogfragment


    【解决方案1】:

    在您的onClick(View view) 方法上创建MainActivity 的新实例,而您需要使用已加载的活动实例。

    这样调用

    @Override
    public void onClick(View view) {
    if (view.getId() == R.id.delete) {
          ((MainActivity) getActivity()).thisIsAMethodJustToTryOutMyButton(view);
    }
    

    【讨论】:

    • 谢谢!现在吐司起作用了。但我想我不能在我的 onClick 方法中放置第二个参数,对吧?因为拥有 thisIsAMethodJustToTryOutMyButton(View view) 的目的是调用我的 deleteRow(position),这将删除我在 listview 中的项目。但是要获得在我的 MainActivity 中声明的位置,我需要这样做: thisIsAMethodJustToTryOutMyButton(View view, int position){ deleteRow(position) } 但是 MyDialogForDeletingAItem.java 告诉我必须放置第二个 (int) 参数在我的 onClick 方法中调用我的方法时。知道该怎么做吗?
    • 第二个参数仅来自片段对吗?
    • 不,它在我的 Adapter.java 类中。请查看更新后的答案
    【解决方案2】:

    您的 deleteRow() 方法应该将 View 作为参数

    public void deleteRow(View view)
    

    public static final int onClick

    在 API 级别 4 中添加了此视图上下文中的方法名称 单击视图时调用。此名称必须对应于公共 方法只接受一个 View 类型的参数。例如,如果 你指定 android:onClick="sayHello",你必须声明一个公共 void 你的上下文(通常是你的 Activity)的 sayHello(View v) 方法。

    必须是字符串值,使用 '\;'转义字符,例如 '\n' 或 '\uxxxx' 表示 unicode 字符。

    这也可能是对资源的引用(形式为 “@[package:]type:name”)或主题属性(形式为 "?[package:][type:]name") 包含此类型的值。

    onClick

    【讨论】:

    • 我取出了我的第一个参数 deleteRow(int position) 并替换为你的。 public void deleteItem(View view){ Toast.makeText(MainActivity.this, "DELETED", Toast.LENGTH_SHORT).show(); } 仍然没有任何反应
    • 如果我在 OnItemLongClick 中调用该方法...它可以工作。但是,使用 onClick 方法的目的就消失了,因为当我将手指放在一个项目上时它调用 deleteRow(View view),而不是当我实际单击“删除”按钮时调用。
    • public class MyDialogForDeletingAItem extends DialogFragment implements View.OnClickListener - 我没有看到实现的 onClick 方法。这是你的完整代码吗?您必须选择一种监听点击的方式...通过通过OnClickListener 实现的onClick 或通过onClick:deleteRow 的xml 声明
    • 我也在 MyDialogForDeletingAItem.class 中尝试过这个。 @Override public void onClick(View view) { if (view.getId() == R.id.delete) { MainActivity main = new MainActivity(); main.thisIsAMethodJustToTryOutMyButton(view);但是这次我得到以下错误: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on an null object reference 此类扩展 DialogFragment 而不是 Activity .这可能是它不起作用的原因吗?
    【解决方案3】:

    在您的 MainActivity 中,您在哪里引用 yourthisIsAMethodJustToTryOutMyButton ?尝试在你的xml文件中添加android:onClick="thisIsAMethodJustToTryOutMyButton"

    【讨论】:

    • 在我的 MainActivity longItemClick(查看视图)中。这样做是立即调用 Toast。我也在我的.xml中更改了我的onClick thisIsAMethodJustTo ....,但仍然是同样的错误。换句话说,当我点击按钮时它不起作用。
    猜你喜欢
    • 2019-05-22
    • 2011-11-25
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多