2016-10-25 14 views
1

リストからユーザーはアイテムをクリックすると、クリックされたアイテムのデータを示すフラグメントが膨らみます。ユーザーはそのデータを編集して保存をクリックして、編集したデータを保存することもできます。私はgetArguments()でnullポインタ例外を受け取り続けます。

しかし、リストを含む画面からは、ユーザーが新しいオブジェクトを作成したい場合は、追加ボタンもあります。

ユーザーがリストから項目をクリックすると、newInstance(..);が と呼ばれ、断片的にonCreateView();私はそのためのすべての変数が異なるビュー内の項目をクリックしたinitilize。私は得続けるので、しかし、それがうまく機能していない:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String, int)' on a null object reference

のnewInstanceはRecyclerViewアダプタのonClick()から呼び出されます。ここ

public static CreateTrainingFragment newInstance(ItemModel itemModel) { 

    bundle = new Bundle(); 

    bundle.putInt(SB_DURATION, itemModel.getDuration()); 
    bundle.putInt(SB_DISTANCE, itemModel.getDistance()); 


    CreateTrainingFragment createTrainingFragment = new CreateTrainingFragment(); 
    createTrainingFragment.setArguments(bundle); 


    return createTrainingFragment; 
} 

私が使用getArgumentsを();引数をビューに渡します。 引数が存在しない場合、デフォルトの0変数が自動的にsbduration.setProgress();に挿入されませんか?ここで

private void initArgumentsData() { 


     sbduration.setProgress(getArguments().getInt(SB_DURATION, 0)); 
     sbDistance.setProgress(getArguments().getInt(SB_DISTANCE, 0)); 


     txtduration.setText(getArguments().getInt(SB_DURATION, 0) + " min"); 
     txtDistance.setText(getArguments().getInt(SB_DISTANCE, 0) + " km"); 


} 

作成し、どこで、私はInitArgumentData()を使用しているか、私の見解です。 RecyclerViewから

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

    sbduration = (SeekBar) v.findViewById(R.id.seekbar_time); 
    sbDistance = (SeekBar) v.findViewById(R.id.seekbar_distance); 


    txtduration = (TextView) v.findViewById(R.id.time_value); 
    txtDistance = (TextView) v.findViewById(R.id.distance_value); 


    sbduration.setMax(100); 
    sbDistance.setMax(50); 



    initArgumentsData(); 
} 

は、私はこのような新しいフラグメントインスタンスを起動します。

addbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      getFragmentManager().beginTransaction().replace(R.id.navdrawer_maincontainer,new CreateTrainingFragment()).addToBackStack(null).commit(); 

     } 
    }); 
+0

新しいフラグメントインスタンスをどのように開始しますか? – fluffyBatman

+0

RecyclerViewアダプタのフルコードを掲載することができますか? – Rahul

+0

bundle = new Bundle();どうして変数をメソッドlocalに束縛しないのですか?このバンドル変数はどこからでもヌルに設定されていません。 – Rahul

答えて

1
getFragmentManager().beginTransaction().replace(R.id.navdrawer_maincontainer,new CreateTrainingFragment()).addToBackStack(null).commit(); 
:フラグメントはこのように開始された追加ボタンから

itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       ItemModel itemModel = realm.getDefaultInstance().where(ItemModel.class).equalTo("timestamp",list.get(getAdapterPosition()).getTimestamp()).findFirst(); 
       CreateTrainingFragment createTrainingFragment = CreateTrainingFragment.newInstance(itemModel, true); 

       fragmentManager.beginTransaction().replace(R.id.navdrawer_maincontainer,createTrainingFragment).addToBackStack(null).commit(); 

      } 
     }); 

彼あなたはnew CreateTrainingFragment()を使用しています。したがって、バンドルが添付されていないため、バンドルを取得できません。最初にnewInstanceメソッドを呼び出してCreateTrainingFragmentのオブジェクトを取得し、それを置き換える必要があります。

ItemModel itemModel = realm.getDefaultInstance().where(ItemModel.class).equalTo("timestamp",list.get(getAdapterPosition()).getTimestamp()).findFirst(); 
CreateTrainingFragment createTrainingFragment = CreateTrainingFragment.newInstance(itemModel, true); 

getFragmentManager().beginTransaction().replace(R.id.navdrawer_maincontainer, createTrainingFragment).addToBackStack(null).commit(); 
+0

私は 'CreateTrainingFragment'や' newInstance'を呼び出すべきでしょうか? – Muddz

+0

どちらも行います。 newInstanceメソッドを保持するクラスの名前は何ですか? – fluffyBatman

+0

これは 'CreateTrainingFragment'です – Muddz

1

引数が存在するかどうかチェックするのはどうでしょうか?

private void initArgumentsData() { 

    Bundle args = getArguments(); 

    int duration = 0; 
    int distance = 0; 

    if (args != null) { 
     duration = args.getInt(SB_DURATION, 0); 
     distance = args.getInt(SB_DISTANCE, 0); 
    } 
    sbduration.setProgress(duration); 
    sbDistance.setProgress(distance); 

    txtduration.setText(duration + " min"); 
    txtDistance.setText(distance + " km"); 
} 

あなたが断片上newInstanceをコールしなかった場合でも、そのメソッドにnew ItemModelを提供する必要があります。

+0

私はあなたのソリューションを試してみました。それで2つの答えのどれがベストプラクティスですか? – Muddz

+0

さて、私のソリューションはNullPointerExceptionを完全に処理しますが、追加フィールドのメンテナンス性を犠牲にしています。私が言ったように、もう一つの答え(正しい間に)は 'new ItemModel'を追加することができませんでした。いずれにせよ、私は両方の組み合わせを言うだろう。 –

+1

実際に私はあなたの解決策を使用しました。なぜなら、何が起きているのか、どこでコードがどこにあるのかということです。 – Muddz

関連する問題