2016-07-03 12 views
1

は、私は、次のトレースバックがtriggedされ、それをクリックすると、 "btn_scansiona" ボタンIDに問題がある方法onButtonClick(ビュー)を見つけることができませんでした:アンドロイド -

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

}

MainActivity.javaでメソッド "onButtonClick"を宣言すると、次のトレースバックが表示されなくなりますが、 "txt.length"に関する別のトレースバックが返されます。 私のミスはどこですか?ありがとう Daniele

答えて

2

まず、onClick方法は、親アクティビティ中に存在しなければならないので、エラーが場合には来ていない理由ですアクティビティクラスにコードを移動

OR

の場合あなたのフラグメントでそれをしたい、あなたはフラグメントのボタンを初期化し、そのためのonClickListenerを設定し、このような何かする必要があります:

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

、あなたはのgettinていますあなたのEditTextとしてtxtを定義した、それはそれ内のテキストではありません

  • :のでグラムtxt.length()はnullにエラーすることはできません。あなたはtextをフェッチして、このようなStringに変換する必要があります:
    • txt.getText().toString()

、あなたはこのようなあなたの通常の処理を行うことができます。

txt.getText().toString().length() 
+0

これは仕事でした!説明をありがとう – DarkVex

0

メソッドを 'onButtonClick'に移動してください。すべての

0

の代わりにレイアウト内にButtonClickListenerメソッドを定義します。なぜ..あなたは、コード内でbuttonClickListenerを定義いけない

削除アンドロイド:レイアウトから、コード内のonClickタグは..あなたが活動中にそのメソッドを定義する必要があります

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

歓迎ダニエル

0

を使用しています。

私はあなたのコードをこのように書く場合は、Butterknifeライブラリを使用することをお勧めします。それは非常に簡単です:

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

    } 

ビルド。グラデル

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