2017-03-22 3 views
0

MainActivity 내에서 목록보기에 개체 배열이 표시되고 목록에 필터를 추가하려면 MainActivity에 대화 상자 조각을 나타내는 부동 단추를 추가했습니다.EditText에서 텍스트를 가져 오는 메서드가 포함 된 사용자 정의 DialogFragment

편집 나는 그것이 NullPointerException 오류이며 edittext에서 왔음을 알고 있으며, 그렇게 만든 코드에 무엇이 잘못된 것인지 알고 싶습니다.

이 대화 상자에는 기본 양수 및 음수 버튼이있는 2 개의 편집 텍스트 필드가 표시됩니다.

편집 텍스트에 입력 된 텍스트를 검색하고이를 기반으로 목록을 필터링하는 양수 버튼을 누르면 사용자 정의 방법을 호출하려고합니다.

문제는 내가 얻을 수있다

java.lang.NullPointerException이 : null 객체 참조에 'android.view.View에서 android.view.View.findViewById (int)를'가상 메서드를 호출하는 시도

코드
MainActivity

public class MainActivity extends AppCompatActivity { 

private ListView listView; 
public CustomAdaptar adaptar; 

protected static ArrayList<Trip> trips = new ArrayList<>(); 
protected static ArrayList<Trip> allTrips = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.listView); 
    adaptar = new CustomAdaptar(); 
// A lot of code for setting the list and other funcutionality 

    FloatingActionButton fab_filter = (FloatingActionButton) findViewById(R.id.fab_filter); 
    fab_filter.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      DialogFrag filter = new DialogFrag(); 
      filter.show(getFragmentManager(),"Filter"); 
     } 
} } 

DialogFragment 코드

public class DialogFrag extends DialogFragment{ 
LayoutInflater inflater; 
EditText min; 
EditText max; 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    inflater = getActivity().getLayoutInflater(); 
    builder.setView(inflater.inflate(R.layout.filter_popup, null)); 

    builder.setMessage("Filter") 
      .setPositiveButton("Filter", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        customFilter(); 
       } 
      }) 
      .setNegativeButton("Back", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 

       } 
      }); 

    min = (EditText) getView().findViewById(R.id.et_filterMinPrice); 
    max = (EditText) getView().findViewById(R.id.et_filterMaxPrice); 
    return builder.create(); 
} 

public void customFilter() { 
    MainActivity.trips.clear(); 

    String et_minPrice = min.getText().toString(); 
    String et_maxPrice = max.getText().toString(); 

    int minPrice = Integer.parseInt(et_minPrice); 
    int maxPrice = Integer.parseInt(et_maxPrice); 

    if (et_minPrice.length()>0 && et_maxPrice.length()==0) { 
     //Do the filtering 
     } 

편집 스택 트레이스

FATAL EXCEPTION: main 
                       Process: com.transcendedapps.customlistandjson, PID: 1071 
                       java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                        at com.transcendedapps.customlistandjson.DialogFrag.customFilter(DialogFrag.java:49) 
                        at com.transcendedapps.customlistandjson.DialogFrag$2.onClick(DialogFrag.java:29) 
                        at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:158) 
                        at android.app.ActivityThread.main(ActivityThread.java:7229) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+1

올리기가 사용 된 코드는 거의 복사됩니다 – Kushan

답변

0

onCreate(@Nullable Bundle savedInstanceState)에 아직 부풀려이 없기 때문에 당신이 onViewCreated(View view, @Nullable Bundle savedInstanceState)를 사용해야합니다 DialogFragment 내부 전경을 팽창합니다. 다음과 같이 할 수 있습니다.

먼저 filter_popup 레이아웃에 버튼을 추가하십시오. 그런 다음 :

public static DialogFrag newInstance(FragCallback callback) { 
    Bundle bundle = new Bundle(); 
    bundle.putSerializable("FragCallback", callback); 
    DialogFrag dialog = new DialogFrag(); 
    dialog.setArguments(bundle); 
    return dialog; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.filter_popup, container, false); 
} 
... 
@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    this.callback = (FragCallback) getArguments().getSerializable("FragCallback"); 
    min = (EditText) view.findViewById(R.id.et_filterMinPrice); 
    max = (EditText) view.findViewById(R.id.et_filterMaxPrice); 
    customButton = (Button) view.findViewById(R.id.custom_button); // the button in your layout 
    customButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      callback.filter(min.getText().toString(),min.getText().toString()); 
     } 
    }); 
} 

콜백 인터페이스 : 활동에

public interface FragCallback extends Serializable { 

    void filter(String min, String max); 
} 

:이 솔루션을

public class MainActivity extends AppCompatActivity implements FragCallback{ 
... 
FloatingActionButton fab_filter = (FloatingActionButton) findViewById(R.id.fab_filter); 
fab_filter.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DialogFrag.newInstance(this).show(getFragmentManager(),FragDialog.class.getSimpleName()); 
    } 
} 
.... 
@Override 
public void filter(String max, String min){ 
    //do the filtering 
} 

onCreateDialog(Bundle savedInstanceState)를 호출 할 필요가 없습니다.

+0

구글 대화 상자에서 붙여 넣기하시기 바랍니다 스택 추적 이 https://developer.android.com/guide/topics/ui/dialogs.html#DialogFragment –

+0

여기에 새로운 문서를 참조하십시오 참조 : https://developer.android.com/reference/android/app/DialogFragment.html –

+0

당신에게 유용 할 지 알려주세요 –

관련 문제