繁体   English   中英

Java方法即使不使用也需要参数

[英]Java method requires argument even though it is not used

所以,我在Android Studio中弄乱了,我有一个看起来像这样的方法:

public void check(View view) {
        EditText numberEditText = findViewById(R.id.number);
        int number = Integer.parseInt(numberEditText.getText().toString());
        Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
    }

该方法在按下按钮时被调用,并且按预期方式工作。 但是,当我从方法中删除参数时,

public void check() {
        EditText numberEditText = findViewById(R.id.number);
        int number = Integer.parseInt(numberEditText.getText().toString());
        Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
    },

只要按下按钮,应用就会崩溃。 我发现这很奇怪,因为我实际上没有使用传递的View 我认为这与View传递有关并且我不接受任何参数是一个问题。 有什么方法可以解决View中的问题吗? 我认为,当该方法接受未使用的参数时,会使代码更难以阅读。

这是堆栈跟踪:

08-08 19:37:55.120 11217-11217/com.example.corfi.numbershapes E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.corfi.numbershapes, PID: 11217
    java.lang.IllegalStateException: Could not find method check(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button3'
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

在此先感谢您的帮助!

您已经通过xml布局(在其中设置了

android:onClick="click"

现在,由于这个原因,预期的点击监听器功能是

public void click(View view){}

单击按钮时,android控制器将视图传递给此活动,因此系统将知道单击的内容。

替代方法是不在布局内添加侦听器,也不在代码中添加侦听器

从布局xml中删除android:onClick部分

然后在您的代码中,首先找到按钮的视图

Button yourbutton =  findViewById('R.id.yourbuttonid');

现在在此设置一个点击监听器

yourbutton.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
          //Do your thing
        }

});

即使在这里,您也可以看到内部方法传递了一个View。 这是设计使然

将针对每种情况的侦听器提供View,如果要删除匿名侦听器和View参数,可以尝试使用ButterKnife ,可以按以下方式使用它

@OnClick(R.id.yourButtonId)
public void onYourButtonClick(){
    //your logic
} 

您需要在param中引用视图,因为android如何找到视图组件的侦听器。

如果您查看文档 ,则标准方法还将视图放入参数中,例如以下代码块:

public class MyActivity extends Activity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         setContentView(R.layout.content_layout_id);

         final Button button = findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {

             // On click method has parameter View v
             public void onClick(View v) {
                 // Code here executes on main thread after user presses button
             }
         });
     }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM