【问题标题】:Android-Java: java.lang.IllegalStateException: Could not execute method for android:onClickAndroid-Java:java.lang.IllegalStateException:无法执行 android:onClick 的方法
【发布时间】:2021-01-11 12:03:32
【问题描述】:

我正在尝试在视图寻呼机的片段中制作注册表单。该表单有四个文本字段和一个按钮,单击按钮时出现上述异常。 onClick 方法是下面类中定义的 registerUser(View view)。

ViewPager 活动

public class getStarted extends AppCompatActivity {
TextInputEditText n,p,e,a;
SignInButtonImpl btn;
MaterialCheckBox tc;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.get_started);
    n= findViewById(R.id.sname);
    p= findViewById(R.id.spass);
    e= findViewById(R.id.semail);
    a= findViewById(R.id.sage);
    btn= findViewById(R.id.signup);
    tc=findViewById(R.id.tc);
    getStartedPagerAdapter pageAdapter = new getStartedPagerAdapter(getSupportFragmentManager());
    ViewPager viewPager = findViewById(R.id.view_pager);
    viewPager.setAdapter(pageAdapter);

}
public void registerUser(View view) {
    //Name validation check

    if(n.getText().toString().trim().equals("")){
        n.setError("Name is Required");
        n.requestFocus();
        return;
    }

    //Password Validation Checks
    if(p.getText().toString().trim().equals("")){
        p.setError("Password is Required");
        p.requestFocus();
        return;
    }
    if(p.getText().toString().trim().length()<6){
        p.setError("Password must be at least 6 characters");
        p.requestFocus();
        return;
    }

    //Age Validation Check
    if(a.getText().toString().trim().equals("")){
        a.setError("Age is Required");
        a.requestFocus();
        return;
    }
    if(a.getText().toString().trim()!="") {
        if (Integer.parseInt(a.getText().toString().trim()) <= 0) {
            a.setError("Please enter a valid age.");
            a.requestFocus();
            return;
        }
    }

    //Email Validation Check
    if(e.getText().toString().trim() == ""){
        e.setError("Email is Required");
        e.requestFocus();
        return;
    }
    if(!Patterns.EMAIL_ADDRESS.matcher( e.getText().toString().trim()).matches()){
        e.setError("Please Enter a valid Email Address");
        e.requestFocus();
        return;
    }

    //Terms and Conditions Validation Check
    if(!tc.isChecked()){
        tc.setError("Agree To continue.");
        tc.requestFocus();
        return;
    }


    System.out.println("Button Working");
    }
}

注册片段

public class signupFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.signup_fragment, container, false);
    }
}

查看寻呼机适配器

public class getStartedPagerAdapter extends FragmentPagerAdapter {
public getStartedPagerAdapter(FragmentManager fm) {
    super(fm);
}
@Override
public Fragment getItem(int position) {
    switch(position){
        case 0:
            return new signupFragment();
        case 1:
           return new loginFragment();
    }
    return null;
}
@Override
public int getCount() {
    return 2; // since we have three fragments
    }

}

Logcat 引用异常

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.rehnsehan, PID: 24606
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
        at androidx.fragment.app.FragmentTransaction.doAddOp(FragmentTransaction.java:161)
        at androidx.fragment.app.BackStackRecord.doAddOp(BackStackRecord.java:179)
        at androidx.fragment.app.FragmentTransaction.add(FragmentTransaction.java:156)
        at androidx.fragment.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:172)
        at androidx.viewpager.widget.ViewPager.addNewItem(ViewPager.java:1010)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1224)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:490)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
        at android.view.View.measure(View.java:25466)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
        at android.view.Choreographer.doFrame(Choreographer.java:731)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I've initialized all views and I am not sure what is causing this exception. Anyone Please help, much appreciated. I also got this error statement,
**Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable com.google.android.material.textfield.TextInputEditText.getText()' on a null object reference
        at com.example.rehnsehan.getStarted.registerUser(getStarted.java:38)**

这是行

 if(n.getText().toString().trim().equals(""))

更新 我尝试了以下建议,将注册功能移至 signupFragment。它会生成以下异常。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rehnsehan, PID: 28540
java.lang.IllegalStateException: Could not find method registerUser(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.gms.common.internal.SignInButtonImpl with id 'signup'
    at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:6302)
    at android.view.View$DeclaredOnClickListener.onClick(View.java:6259)
    at android.view.View.performClick(View.java:7448)
    at android.view.View.performClickInternal(View.java:7425)
    at android.view.View.access$3600(View.java:810)
    at android.view.View$PerformClick.run(View.java:28305)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

【问题讨论】:

  • n 按钮是否在您的 R.layout.get_started 布局中?
  • 您说按钮和文本字段在signupfragment 中,那么为什么要在activity 中定义呢?或尝试也发布您的布局
  • 按钮和文本字段在signup_fragment.xml布局中而不是在getstarted.xml中,android studio自动添加了onClick。
  • @Jak 这就是你得到 NullpointerException 的原因。您正在查看错误的根视图。 n= findViewById(R.id.sname); 在您的 SignupFragment 课程中可以使用。只需将涉及文本字段和按钮的所有逻辑移至 SignupFragment。
  • @TimonNetherlands 我尝试了您的建议并相应地更新了帖子,请查看并进一步指导我。谢谢

标签: java android nullpointerexception android-viewpager gettext


【解决方案1】:

最好不要在 getItem() 中创建片段。 并且最好使用 FragmentStatePagerAdapter。 所以我把你的适配器代码改成喜欢了。

public class getStartedPagerAdapter extends FragmentStatePagerAdapter {
    private Fragment signup = new signupFragment();
    private Fragment login = new LoginFragment();

    public getStartedPagerAdapter(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }
    @Override
    public Fragment getItem(int position) {
        switch(position){
        case 0:
            return signup;
        case 1:
           return login;
        }
        return null;
    }
    @Override
    public int getCount() {
        return 2; // since we have three fragments
    }
}

请更改您的代码,重试。

【讨论】:

  • 谢谢。我试试看。
  • 试过了,还是没有解决问题
【解决方案2】:

在xml中实现onClickListener而不是使用Onclick后问题解决。 补充说明

  1. 在 Fragment 中实现 onClickListener。
  2. 在 java 中使用 onclick 监听器,而不是在 xml 中使用 onClick。
  3. 使用 ViewGroup root = (ViewGroup) inflater.inflate(R.layout.signup_fragment, null);片段中的 root.findViewById()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多