Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
567 views
in Technique[技术] by (71.8m points)

Android-Java: java.lang.IllegalStateException: Could not execute method for android:onClick

I am trying to make a sign up form in a fragment in a view Pager. The form has four text fields and a button, I am getting the above mentioned exception when the button is clicked. The onClick method is registerUser(View view) defined in the class below.

ViewPager Activity

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

SignupFragment

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

View Pager Adapter

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 referring to Exception

    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)**

Here's the line

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

UPDATE I tried the suggestions below, moving the register functionality to signupFragment. It generates the following exception.

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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

It's better don't create fragment in getItem(). And It's better to use FragmentStatePagerAdapter. So I changed your adapter code to like it.

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

Please change your code, retry.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...