2016-10-25 11 views
1

목록에서 사용자가 클릭하여 항목을 클릭하면 클릭 한 항목의 데이터를 보여주는 조각이 펼쳐지며 사용자는 해당 데이터를 편집하고 저장을 클릭하여 편집 된 데이터를 저장할 수 있습니다.getArguments()에서 널 포인터 예외가 계속 발생합니다.

그러나 목록이 포함 된 화면에서 사용자가 새 개체를 만들려면 추가 버튼입니다.

사용자가 목록에서 항목을 클릭

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를(); 인수를 Views에 넣습니다. 인수가 없으면 기본 변수 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

번들 = 새 번들(); 변수를 번들로 묶는 것이 지역 메소드가 아닌가? 이 번들 변수는 어디서든지 null로 설정되지 않습니다. – 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의 개체를 가져온 다음 replace에 배치해야합니다.

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

인수가 있는지 확인하는 것은 어떻습니까? 당신이 조각에 newInstance를 호출했다

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

경우에도 그 방법에 new ItemModel를 제공해야합니다.

+0

방금 ​​해결책을 시도했지만 효과가있었습니다. 그래서 두 가지 답변 중 가장 좋은 방법은 무엇입니까? – Muddz

+0

글쎄, 내 솔루션은 NullPointerException을 완벽하게 처리하지만 추가 필드에 대한 유지 관리가 필요하지 않습니다. 다른 대답 (올바른 동안)은'new ItemModel'을 추가하지 못했습니다. 어느 쪽이든, 나는 둘 다의 조합을 말할 것입니다. –

+1

실제로 나는 당신의 솔루션을 사용했다. – Muddz

관련 문제