DarkVex
DarkVex

Reputation: 157

Android - Could not find method onButtonClick(View)

I have a problem with the button id "btn_scansiona" once I click on it the following traceback is trigged:

java.lang.IllegalStateException: Could not find method onButtonClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'btn_scansiona'
                                                                           at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325)
                                                                           at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
                                                                           at android.view.View.performClick(View.java:4780)
                                                                           at android.view.View$PerformClick.run(View.java:19866)
                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:135)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at java.lang.reflect.Method.invoke(Method.java:372)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

fragment_scan.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.test.myapp.ScanFragment">


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="keywords"
    android:id="@+id/textView3"
    android:layout_gravity="center_horizontal|top"
    android:textStyle="bold"
    android:layout_marginTop="40dp"
    android:textSize="20dp" />

<Button
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:text="scansiona"
    android:id="@+id/btn_scansiona"
    android:layout_gravity="center_horizontal|bottom"
    android:textStyle="bold"
    android:layout_marginBottom="40dp"
    android:background="#ffaa00"
    android:onClick="onButtonClick" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Insert keywords"
    android:id="@+id/textSearch"
    android:layout_marginTop="80dp"
    android:layout_gravity="center_horizontal|top"
    android:enabled="true"
    android:inputType="text"
    android:textColor="@color/abc_input_method_navigation_guard"
    android:textIsSelectable="false"
    android:textSize="20sp"
    android:textStyle="bold"
    android:selectAllOnFocus="false" />

ScanFragment.java

public class ScanFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public ScanFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment ScanFragment.
 */
// TODO: Rename and change types and number of parameters
public static ScanFragment newInstance(String param1, String param2) {
    ScanFragment fragment = new ScanFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_scan, container, false);
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        mListener = (OnFragmentInteractionListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

//DB
private DbManager db=null;
private CursorAdapter adapter;
String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

public void onButtonClick(View view){
    //do something when button is clicked.
    EditText txt=(EditText) view.findViewById(R.id.textSearch);
    if (txt.length()>0 && date.length()>0)
    {
        db.save(txt.getEditableText().toString(), date);
        adapter.changeCursor(db.query());
    }
}

}

If I declare the method "onButtonClick" on MainActivity.java the following traceback disappear but I receive another traceback regarding the "txt.length" cannot be null. Where is my mistake? thanks Daniele

Upvotes: 1

Views: 3376

Answers (4)

Sijan Gurung
Sijan Gurung

Reputation: 797

Instead of defining the ButtonClickListener method in the layout. why dont you define the buttonClickListener in the code.

Remove android:onClick tag from layout and in code and use

Button btnScan = view.findViewById(R.id.btn_scansiona
btnScan.onClickListener(.....) {
    //your rest code here....
}

Upvotes: 0

Shayan_Aryan
Shayan_Aryan

Reputation: 2042

You must define that method in the activity.

BTW I suggest using Butterknife library if you want to write your code this way. It's very easy:

public class FancyFragment extends Fragment {

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        View view = inflater.inflate(R.layout.fancy_fragment, container, false); 
        ButterKnife.bind(this, view);
        return view; 
    }

    @OnClick(R.id.submit) public void submit(View view) {
         // do something ... }
     }

   } 

build.gradle

compile 'com.jakewharton:butterknife:8.1.0'
apt 'com.jakewharton:butterknife-compile

Upvotes: 0

Ashish Ranjan
Ashish Ranjan

Reputation: 5543

First of all, the onClick method should be present in the parent activity, so that's why the error ain't coming in case you move the code to the activity class

OR

If you want to have it in your fragment then you'll have to initialize the button in fragment and set the onClickListener for it, something like this :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

   View view = inflater.inflate(R.layout. fragment_scan,
    container, false);
   Button button = (Button) view.findViewById(R.id.btn_scansiona);
   button.setOnClickListener(new OnClickListener()
   {
             @Override
             public void onClick(View v)
             {
                // do something
             } 
   }); 
   return view;
}

and you're getting txt.length() can't be null error because :

  • You've defined txt as your EditText and it's not the text inside it. You'll have to fetch the text and convert it to String like this :
    • txt.getText().toString()

then you can do your normal processing like this :

txt.getText().toString().length()

Upvotes: 2

Hamidreza Shokouhi
Hamidreza Shokouhi

Reputation: 1031

Move your method 'onButtonClick' to your activity.

Upvotes: 0

Related Questions