2014-01-29 118 views
0

我在對話框片段中設置了搜索字段,然後當用戶最初單擊打開時,允許他們輸入標題並點擊搜索。我希望這能夠傳達回活動的列表視圖。將數據從DialogFragment傳遞迴活動

不幸的是,當我試圖搜索時,我一直在崩潰。我已經使用偵聽器進行了設置,但我認爲它與嘗試從MainActivity的佈局中讀取textView有關,即使它位於DialogFragment'a佈局xml中?

我嘗試通過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) 

編輯新代碼/錯誤:

接受了您的建議,並將字符串傳回方法searchBooks,但現在接受了我認爲沒有任何意義的愚蠢nullpointerexception。 TextView的駐留在我的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

什麼是第327行'MainActivity.java'? – Raghunandan

回答

1

所以是的,問題是R.id.searchfield。它不是一個視圖,它是您的MainActivity的rootview的子視圖,它是對話框片段的子視圖。

空指針正在發生,因爲它沒有找到R.id.searchfield,並且searchfield爲空,因此在調用searchField.getText()時會在下一行左右崩潰。

只需讓你的dialogfrag搜索文本字段並將字符串傳回給主要活動即可。

+0

更新了我的文章,試了一下你說的,並得到了一個新的奇怪的錯誤,沒有多少意義,我爲什麼當按鈕單擊時在textview中鍵入某些內容時,它爲什麼返回nullexception。 – user3117785

+0

實際上我認爲我修復了它,我相信它利用onClick中定義的View v而不是onCreateView中定義的視圖,而不是崩潰。我只是將onCreateView中定義的那個更改爲final,並將該參數重命名爲Onclick中的View視圖。 – user3117785

1

findViewById()只能找到定位的看法d在您在setContentView()中指定的佈局文件中。您需要將TextView轉換爲Activity's佈局,或將此邏輯移至Fragment

+0

這就是我想到的問題。但我無法將TextView移動到我的Activity的佈局中,因爲那樣它就不會顯示在我的DialogFragment中。我無法將邏輯移動到我的片段中,因爲所有的mResult數據以及沒有存儲在MainActivity中的數據。 – user3117785