2015-05-11 65 views
0

我已經在StackOverflow上檢查了很多相同的問題,但是我沒有找到解決我的問題的方法。
DialogFragment中,我調用AsyncTask方法,當從服務器收到結果時,我啓動了另一個DialogFragment
這裏是我使用啓動DialogFragment代碼:DialogFragment(支持v4)崩潰應用程序(NPE)

public class RequesterConfirmRent extends DialogFragment { 

// Called from onPostExecute() in AsyncTask class. 
public void onPostComputeAmountToPay(JSONArray array){ 
     double amountToPay = 0.0; 
     String ownerName = ""; 
     try{ 
      if(!array.getJSONObject(0).getBoolean("success")) 
       Log.e("Error", "Error with JSON received"); 
      else { 
       amountToPay = array.getJSONObject(1).getDouble("amountToPay"); 
       ownerName = array.getJSONObject(2).getString("ownerName"); 
      } 
     }catch(JSONException e){ 
      Log.e(e.getClass().getName(), "JSONException", e); 
     } 

     // Create and show the DialogFragment 
     Paiement p = new Paiement(); 
     Bundle bdl = new Bundle(); 
     bdl.putString("ownerName", ownerName); 
     bdl.putDouble("amountToPay", amountToPay); 
     p.setArguments(bdl); 

     // Buggy line (NPE) 
     p.show(getFragmentManager(), "4554"); 
    } 
} 

這裏是DialogFragment的我嘗試顯示代碼:

public class Paiement extends DialogFragment { 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     if(getDialog() == null) 
      super.setShowsDialog(false); 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.setTitle("Synthesis of your rent"); 
     return dialog; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_paiement, container, false); 
     init(rootView); 
     return rootView; 
    } 

    private void init(View v){// Bla bla ...} 
} 

我送花兒給人得到一個NullPointerException當我打電話了.show()方法?

我做錯了什麼?

非常感謝您的幫助!

編輯1:按照要求,這裏是logcat的

9月5日至11日:58:34.470 31384-31384/com.example.celien.drivemycar E/AndroidRuntime:致命異常:主 顯示java.lang.NullPointerException 在android.support.v4.app.DialogFragment.show(DialogFragment.java:136) 在com.example.celien.drivemycar.fragment.RequesterConfirmRent.onPostComputeAmountToPay(RequesterConfirmRent.java:148)

編輯2我修改了這樣的代碼,看起來getFragmentManager()爲null。爲什麼?

 Paiement p = new Paiement(); 
     Bundle bdl = new Bundle(); 
     bdl.putString("ownerName", ownerName); 
     bdl.putDouble("amountToPay", amountToPay); 
     p.setArguments(bdl); 
     // BUGGY LINE 
     android.support.v4.app.FragmentManager f = getFragmentManager(); 
     if(p == null) 
      Log.d("Exception ", "p is null"); 
     if(f == null) 
      Log.d("Exception ", "f is null"); 

     try { 
      p.show(f, "4554"); 
     }catch(NullPointerException e){ 
      Log.d("Exception ", e.toString()); 
     } 

編輯3: 得到了一些新鮮的相關信息!
爲了避免創建此對話框,我在Toast
Toast.makeText(this.getActivity(), "You have to pay "+amountToPay+"e to " +ownerName, Toast.LENGTH_LONG).show();中顯示數據,並且還獲得了一個NPE
如果我使用日誌系統,一切都很好:

Log.d("Rcvd ", String.valueOf(amountToPay)); 
Log.d("Rcvd ", ownerName); 

那麼,爲什麼我的活動空?

+0

'NullPointerException'你說?發表你應該... – shkschneider

+1

由DialogFragment稱爲DialogFragment聽起來並不像一個好主意logcat的 – Blackbelt

+0

嗯,我想'p'是空... – shkschneider

回答

2

如果在撥打p.show()而不是p.setArguments()時得到NPE,那麼p可能是正常的,但show調用中的某些內容不是?

可能要解決的一點是,您正在使用支持版本FragmentManagergetFragmentManager()調用。改爲嘗試getSupportFragmentManager()。在需要時它會回落到適當的位置。 另一方面,你打電話android.support.v4.app.FragmentManager。如果您手動添加軟件包,這很奇怪,所以您的IDE可能會爲您做。您可以嘗試刪除FragmentManager後面的包,並希望代碼符合不支持的標準框架。可能是因爲只有對支持庫的引用已完成,所以刪除軟件包部分可以解決問題。

我的建議是:在應用程序中,定義活動和片段時始終堅持無論是標準的框架或支持庫。正因爲如此,確保每個ActivityFragment創建延伸的適當的支持(或標準框架)版本。混合它們會導致意想不到的崩潰。

而且,在我的意見之一,AsyncTask自由運行即使您的片段分離,所以沒有機構是否正確由該片段引用了提及。 This answer告訴你通過查看isDetached()來檢查Fragment是否被分離。檢查他的答案。他在談論使用Loader!而非AsyncTask S或移動AsyncTask到活動,使活動始終可用。展望未來,Loader是最好的選擇(因爲它的AsyncTask自然進化),從目前看,嘗試移動AsyncTask到共同的活動。

+0

因此,我調用supportFragmentManager():'FragmentManager F = getActivity()getSupportFragmentManager();'和'進口android.support.v4.app.FragmentManager;'。但在創建f時獲得了NPE。 – Mornor

+0

只要你使用v4版本的Fragment,FragmentManager,FragmentTransaction等等,是的。你應該注意這一點。其他方面,您可能稍後會發現該應用在某些Android設備上無法正常工作。希望代碼在部署之前會因爲這個而感激不盡,但確保您在整個應用程序中使用支持庫總是一個好主意。 – Korcholis

+0

感謝您的建議!但不知道該怎麼做才能修復它? – Mornor