2017-07-18 15 views
0

私は、スピナーをアクティビティーではなくフラグメント内に組み込むプログラムを作成しています。私はこれがなぜクラッシュするかもしれないのかを調査しましたが、無駄です。私の最初の懸念は.getView()。findViewById()でしたが、今はそれが問題であるとは確信していません。ここにコードがあります。私は確かに言うことはできませんが、私は、この行がクラッシュした疑いがあるスタックトレースを見ないとスピナー・フラグメントが頻繁にクラッシュする

public class Add extends Fragment { 


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

ArrayList<String> ingredients = new ArrayList<>(); 
SpinnerDialog spinnerDialog; 
Button add; 


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


    add = (Button) getView().findViewById(R.id.add); 
    add.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      spinnerDialog.showSpinerDialog(); 

     } 

    }); 
    // Inflate the layout for this fragment 

    return inflater.inflate(R.layout.fragment_add, container, false); 

} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    spinnerDialog = new SpinnerDialog(getActivity(), ingredients, "Select An Ingredient"); 
    spinnerDialog.bindOnSpinerListener(new OnSpinerItemClick() { 
     @Override 
     public void onClick(String Ingredient, int i) { 

      Toast.makeText(Add.super.getContext(), "Selected ", Toast.LENGTH_SHORT).show(); 

     } 
    }); 

答えて

1

add = (Button) getView().findViewById(R.id.add); 

getView()onCreateView()によって返さViewインスタンスを返しますので、これはですが...しかし、あなた現在onCreateView()になっているので、getView()nullを返します。

onCreateView()は次のように書き換えることができます。

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

    View root = inflater.inflate(R.layout.fragment_add, container, false); 
    add = (Button) root.findViewById(R.id.add); 
    add.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      spinnerDialog.showSpinerDialog(); 
     } 
    }); 

    return root; 
} 
関連する問題