2017-11-13 8 views
-1

ボタンを対応するリスナーでフラグメント化しました。このアクティビティを呼び出すたびに、アプリがクラッシュします。 LogcatはNULLポインタ例外を示します。以下のコードは、Fragmentクラスのスニペットです。フラグメントからのフラグメントがアプリケーションをクラッシュする

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_carprofile_list, container, false); 

    // Set the adapter 
    if (view instanceof RecyclerView) { 
     Context context = view.getContext(); 
     RecyclerView recyclerView = (RecyclerView) view; 
     if (mColumnCount <= 1) { 
      recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
     } else { 
      recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); 
     } 
     recyclerView.setAdapter(new MyCarProfileRecyclerViewAdapter(carProfileContent.ITEMS, mListener)); 
    } 

    Button imgbtn = (Button) view.findViewById(R.id.editCarProfileButton); 
    imgbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(getActivity(),ReserveActivity.class)); 
     } 
    }); 

    return view; 
} 

Logcatを示しています。

FATAL EXCEPTION: main 
Process: com.example.app, PID: 13571 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.CarProfileListActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) 
at android.app.ActivityThread.access$800(ActivityThread.java:151) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
at android.os.Handler.dispatchMessage(Handler.java:110) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:5333) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at com.mikepuno.parkeazy.CarProfileFragment.onCreateView(CarProfileFragment.java:78) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) 
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) 
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) 
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580) 
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) 
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229) 
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221) 
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171) 
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192) 
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:560) 
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177) 
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1174) 
at android.app.Activity.performStart(Activity.java:5353) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2340) 

私はここに、複数の同様の問題を見てきたが、ちょうど私のために働くしていないようです。私はボタンとリスナーを追加した方法から何かが欠けていますか?

fragment_carprofile_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/list" 
    android:name="com.mikepuno.parkeazy.CarProfileFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    app:layoutManager="LinearLayoutManager" 
    tools:context="com.mikepuno.parkeazy.CarProfileFragment" 
    tools:listitem="@layout/fragment_carprofile" /> 

fragment_carprofile.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/plateNumberTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="8dp" 
     android:textAppearance="?attr/textAppearanceListItem" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/brandTextView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:textAppearance="?attr/textAppearanceListItem" /> 

     <TextView 
      android:id="@+id/modelTextView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:textAppearance="?attr/textAppearanceListItem" /> 

     <TextView 
      android:id="@+id/colorTextView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:textAppearance="?attr/textAppearanceListItem" /> 

     <Button 
      android:id="@+id/editCarProfileButton" 
      android:layout_width="64dp" 
      android:layout_height="64dp" 
      android:text="Edit" /> 

    </LinearLayout> 
</LinearLayout> 

アダプタクラス

public class MyCarProfileRecyclerViewAdapter extends RecyclerView.Adapter<MyCarProfileRecyclerViewAdapter.ViewHolder> { 

    private final List<CarProfile> mValues; 
    private final OnListFragmentInteractionListener mListener; 

    public MyCarProfileRecyclerViewAdapter(List<CarProfile> items, OnListFragmentInteractionListener listener) { 
     mValues = items; 
     mListener = listener; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.fragment_carprofile, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     holder.mItem = mValues.get(position); 
     holder.mPlateNumberTextView.setText(mValues.get(position).getPlateNumber()); 
     holder.mBrandTextView.setText(mValues.get(position).getBrand()); 
     holder.mModelTextView.setText(mValues.get(position).getModel()); 
     holder.mColorTextView.setText(mValues.get(position).getColor()); 

     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (null != mListener) { 
        // Notify the active callbacks interface (the activity, if the 
        // fragment is attached to one) that an item has been selected. 
        mListener.onListFragmentInteraction(holder.mItem); 
       } 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return mValues.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public final View mView; 
     public final TextView mPlateNumberTextView; 
     public final TextView mBrandTextView; 
     public final TextView mModelTextView; 
     public final TextView mColorTextView; 
     public CarProfile mItem; 

     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mPlateNumberTextView = (TextView) view.findViewById(R.id.plateNumberTextView); 
      mBrandTextView = (TextView) view.findViewById(R.id.brandTextView); 
      mModelTextView = (TextView) view.findViewById(R.id.modelTextView); 
      mColorTextView = (TextView) view.findViewById(R.id.colorTextView); 
     } 

     @Override 
     public String toString() { 
      return super.toString() + " '" + mPlateNumberTextView.getText() + "'"; 
     } 
    } 
} 
+3

完全なエラーログを投稿できますか? –

+0

@EmreAktürk更新されたlogcatをご覧ください。 – Mike

+0

アダプタクラス、フラグメントレイアウト、行レイアウトファイルも投稿してください。 –

答えて

1

ビューを展開した後

View view = inflater.inflate(R.layout.fragment_carprofile_list, container, false); 

あなたはそのビューがRecyclerViewだとします。それはルート要素がリサイクルの視点であることを意味します。

はその後ofcourseのnullを返します

Button imgbtn = (Button) view.findViewById(R.id.editCarProfileButton); 

を実行して、そのrecyclerviewの内側のボタンを見つけよう。次にnullオブジェクトにクリックリスナーを設定しようとしています。

xmlファイルが間違っているようです。各行に見つけようとしているボタンがある場合は、アダプタクラスでそのボタンをキャッチしてから、処理を行うためにフラグメントに通知する必要があります。

SOLUTION(EDIT):

断片でonCreateViewからこれらの行を削除します。

Button imgbtn = (Button) view.findViewById(R.id.editCarProfileButton); 
    imgbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(getActivity(),ReserveActivity.class)); 
     } 
    }); 

すでにフラグメントを通知するインターフェイスがあります。 編集用に使用する予定です。

ので、最終的なアダプタクラスは、あなたのフラグメント

@Override 
    public void onListFragmentInteraction(CarProfile profile) { 
     // TODO Pass your profile to ReserverActivity by using bundles. 
     startActivity(new Intent(getActivity(), ReserveActivity.class)); 
    } 

その後

public class MyCarProfileRecyclerViewAdapter extends RecyclerView.Adapter<MyCarProfileRecyclerViewAdapter.ViewHolder> { 

private final List<CarProfile> mValues; 
private final OnListFragmentInteractionListener mListener; 

public MyCarProfileRecyclerViewAdapter(List<CarProfile> items, OnListFragmentInteractionListener listener) { 
    mValues = items; 
    mListener = listener; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.fragment_carprofile, parent, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.mItem = mValues.get(position); 
    holder.mPlateNumberTextView.setText(mValues.get(position).getPlateNumber()); 
    holder.mBrandTextView.setText(mValues.get(position).getBrand()); 
    holder.mModelTextView.setText(mValues.get(position).getModel()); 
    holder.mColorTextView.setText(mValues.get(position).getColor()); 
} 

@Override 
public int getItemCount() { 
    return mValues.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    public final TextView mPlateNumberTextView; 
    public final TextView mBrandTextView; 
    public final TextView mModelTextView; 
    public final TextView mColorTextView; 
    public CarProfile mItem; 

    public ViewHolder(View view) { 
     super(view); 

     view.setClickable(true); // This is important 
     view.setOnClickListener(this); 

     mPlateNumberTextView = (TextView) view.findViewById(R.id.plateNumberTextView); 
     mBrandTextView = (TextView) view.findViewById(R.id.brandTextView); 
     mModelTextView = (TextView) view.findViewById(R.id.modelTextView); 
     mColorTextView = (TextView) view.findViewById(R.id.colorTextView); 
    } 

    public void onClick(View view) { 
     if (null != mListener) { 
      mListener.onListFragmentInteraction(mValues.get(getAdapterPosition())); 
     } 
    } 

    @Override 
    public String toString() { 
     return super.toString() + " '" + mPlateNumberTextView.getText() + "'"; 
    } 
    } 

ようにする必要がありますあなたはあなたのボタンのクリックでフラグメントを通知することにより、コードを向上させることができます。したがって、ボタンのクリックリスナーと通知コードもここになければなりません。

+0

どこにpublic void onListFragmentInteraction ...コードブロックを置くべきですか?メソッドを実装するクラスには?ボタンの場合は動作しませんが、ヌルポインタエラーはなくなります。 – Mike

+0

'Button btn = view.findViewById(R.id.editCarProfileButton);を設定することで、ボタンを機能させることができました。 btn.setOnClickListener(this) '; https://stackoverflow.com/questions/18711433/button-listener-for-button-in-fragment-in-android – Mike

1
View view = inflater.inflate(R.layout.fragment_carprofile_list, container, false); 

あなたはRecyclerViewが含まれているfragment_carprofile_list.xmlを膨らませています。そのXMLにはButtonという言及はありません。なぜなら、あなたはそれを取得しているからですNullPointerException

+0

こんにちは、私はそれに対処する方法を提案していますか?私がinflaterからfragment_carprofile_list.xmlを変更すると、表示したい項目がなくなります。 – Mike

+0

洞察をいただき、ありがとうございました。 – Mike

関連する問題