2014-01-29 2 views
0

대화 상자에 검색 필드가 설정된 다음 사용자가 처음 열려면 클릭하면 제목 및 조회가 입력됩니다. Activity의 listview와 다시 통신 할 수 있기를 바랍니다.DialogFragment에서 Activity로 데이터를 다시 전달

불행히도 나는 검색을 시도 할 때 충돌이 계속 발생합니다. 나는 청취자를 사용하여 설정했지만 DialogFragment'a 레이아웃 xml에 있어도 MainActivity의 레이아웃에서 textView를 읽으려는 것과 관련이 있다고 생각한다.

MainActivity에서 R.id.searchField를 호출하여 onCreate의 setContent의 레이아웃 XML이 DialogFragment가 구현 한 것과 다릅니다. 그렇게하려고 할 때 아무런 오류가 없으며, 치명적인 충돌 만 있습니다.

MainActivity :

public class MainActivity extends Activity implements searchListener{ 
public void searchBooks() 
    { 
// Error is in this function, believe it has to do with this textField as it resides in // the DialogFragment's xml? Unless findViewById calls from all XMLS and just not one defined in 
//setContentView for the activity? Not sure though, initially I feel I should have this searchField 
//defined in the fragment class, but then I won't have access to it in this function in MainActivity, 
//or the mResults which is where the data is being used 

     EditText searchField = (EditText) findViewById(R.id.searchField); 

     if (mResults != null && !searchField.getText().equals("")) 
     { 

      String inputedText = searchField.getText().toString(); 
      JSONArray results = new JSONArray(); 

      for (int i = 0; i < mResults.length(); i++) 
      { 
       try { 
        JSONObject bookObject = mResults.getJSONObject(i); 
        if (bookObject.get("name").toString().equalsIgnoreCase(inputedText)) 
        { 
         results.put(bookObject); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 
    } 
public void showDialog() { 
    DialogFrag newFragment = DialogFrag.newInstance(); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Setting the main view 
     setContentView(R.layout.activity_main_fragment); 
} 
} 

DialogFragment :

public class DialogFrag extends DialogFragment { 
    public static DialogFrag newInstance() { 
     return new DialogFrag(); 
    } 
    private searchListener listener; 
    public interface searchListener 
    { 
     public void searchBooks(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      listener = (searchListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + "attaching d fragment failed!"); 
     } 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.search_dialog_fragment, container, false); 

     searchButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       listener.searchBooks(); 
      } 
     }); 
     return v; 
    } 
} 

스택 트레이스

01-29 20:10:21.570: E/AndroidRuntime(11260): FATAL EXCEPTION: main 
01-29 20:10:21.570: E/AndroidRuntime(11260): Process: com.brentadams.bookList, PID: 11260 
01-29 20:10:21.570: E/AndroidRuntime(11260): java.lang.NullPointerException 
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.brentadams.bookList.MainActivity.searchBooks(MainActivity.java:327) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.brentadams.bookList.fragments.SearchFragment$1.onClick(SearchFragment.java:48) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.view.View.performClick(View.java:4438) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.view.View$PerformClick.run(View.java:18422) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Handler.handleCallback(Handler.java:733) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Handler.dispatchMessage(Handler.java:95) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.os.Looper.loop(Looper.java:136) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at android.app.ActivityThread.main(ActivityThread.java:5017) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at java.lang.reflect.Method.invokeNative(Native Method) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at java.lang.reflect.Method.invoke(Method.java:515) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
01-29 20:10:21.570: E/AndroidRuntime(11260): at dalvik.system.NativeStart.main(Native Method) 
하지 내가 여기에서 오류가 발생하는 이유 다른 확인은 아래 코드와 스택 추적입니다

새 코드 편집/오류 :

당신의 충고를 받아서 string을 searchBooks 메서드에 다시 전달해 보았습니다. 그러나 지금 생각해 보면 어리석은 nullpointerexception을 받는다는 것은 의미가 없습니다. 텍스트 뷰 내 activity_main_fragment.xml에 있습니다 :

public class MainActivity extends Activity implements searchListener{ 
public void searchBooks(String searchString) 
    { 


     if (mResults != null && searchString != null && !searchString.equals("")) 
     { 


      JSONArray results = new JSONArray(); 

      for (int i = 0; i < mResults.length(); i++) 
      { 
       try { 
        JSONObject bookObject = mResults.getJSONObject(i); 
        if (bookObject.get("name").toString().equalsIgnoreCase(searchString)) 
        { 
         results.put(bookObject); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 
    } 
public void showDialog() { 
    DialogFrag newFragment = DialogFrag.newInstance(); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Setting the main view 
     setContentView(R.layout.activity_main_fragment); 
} 
} 

DialogFragment

public class DialogFrag extends DialogFragment { 
    public static DialogFrag newInstance() { 
     return new DialogFrag(); 
    } 
    private searchListener listener; 
    public interface searchListener 
    { 
     public void searchBooks(String text); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      listener = (searchListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + "attaching d fragment failed!"); 
     } 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.search_dialog_fragment, container, false); 

     searchButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       EditText searchField = (EditText) v.findViewById(R.id.searchField); 
       String input = searchField.getText().toString(); 
       listener.searchBooks(input); 
      } 
     }); 
     return v; 
    } 
} 

스택 트레이스

01-29 15:30:31.402: E/AndroidRuntime(777): FATAL EXCEPTION: main 
01-29 15:30:31.402: E/AndroidRuntime(777): java.lang.NullPointerException 
01-29 15:30:31.402: E/AndroidRuntime(777): at com.brentadams.bookList.fragments.SearchFragment$1.onClick(SearchFragment.java:51) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.view.View.performClick(View.java:4084) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.view.View$PerformClick.run(View.java:16966) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Handler.handleCallback(Handler.java:615) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.os.Looper.loop(Looper.java:137) 
01-29 15:30:31.402: E/AndroidRuntime(777): at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-29 15:30:31.402: E/AndroidRuntime(777): at java.lang.reflect.Method.invokeNative(Native Method) 
01-29 15:30:31.402: E/AndroidRuntime(777): at java.lang.reflect.Method.invoke(Method.java:511) 
01-29 15:30:31.402: E/AndroidRuntime(777): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-29 15:30:31.402: E/AndroidRuntime(777): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-29 15:30:31.402: E/AndroidRuntime(777): at dalvik.system.NativeStart.main(Native Method) 

행 51 :

 String input = searchField.getText().toString(); 
+0

스택 추적을 게시하십시오. – Raghunandan

+0

시간을내어 주셔서 감사합니다. – user3117785

+0

'MainActivity.java' 란 무엇입니까? – Raghunandan

답변

1

그래, 문제는 R.id.searchfield입니다. MainActivity의 rootview의 자식 인 뷰가 아니라 대화 상자 조각의 하위 뷰입니다.

null 포인터가 R.id.searchfield를 찾지 않아서 발생하며 searchfield가 null이므로 결과적으로 searchField.getText()를 호출 할 때 다음 라인에서 충돌합니다.

dialogfrag에서 텍스트 필드를 검색하고 주요 활동에 문자열을 전달하십시오.

+0

내 게시물이 업데이트되었습니다. 당신이 말한 것을 시도해 보았습니다. 새로운 이상한 오류가있어서, 버튼 클릭시 textview에 무언가가 입력 될 때 nullexception을 반환하는 이유가 무엇인지 알 수 없습니다. – user3117785

+0

사실 나는 그것을 고쳤다 고 생각합니다. OnCreateView에 정의 된 것보다 오히려 onClick에 정의 된 View v를 활용하고 있다고 믿습니다. 충돌을 일으켰습니다. onCreateView에 정의 된 뷰를 final로 변경하고 Onclick에서 뷰 뷰로 매개 변수의 이름을 변경했습니다. – user3117785

1

findViewById() 만 찾을 뷰의 위치 d를 setContentView()에 지정된 레이아웃 파일에 복사하십시오. TextViewActivity's 레이아웃으로 이동하거나이 로직을 Fragment으로 옮길 필요가 있습니다.

+0

그게 내가 생각하고있는 문제 다. 하지만 TextView를 내 Activity의 레이아웃으로 옮길 수는 없습니다. DialogFragment에 표시되지 않기 때문입니다. 모든 mResult 데이터와 무엇이 MainActivity 내에 저장되지 않았기 때문에 로직을 내 조각으로 이동할 수 없습니다. – user3117785

관련 문제