2014-02-18 61 views
0

我想使用DialogFragment顯示自定義對話框。但是,在我需要修改它們之前,我無法初始化佈局視圖。未調用DialogFragment的onCreate()回調(在哪裏初始化視圖?)

這是我的DialogFragment類。

public class RemoteProgressDialog extends DialogFragment { 

private TextView lockProgress; 
private TextView foldProgress; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Dialog_NoActionBar); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.remote_progress_dialog, null); 
    lockProgress = (TextView) view.findViewById(R.id.lock_progress); 
    return view; 
} 

public void lockFinished() { 
    lockProgress.setCompoundDrawables(
            null, 
            getResources().getDrawable(R.drawable.icn_mycar_sunroof_open), 
            null, null); 
    // TODO: remove 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    showLockProgress(false); 
    dismissDialogIfNeeded(); 
} 

public void showLockProgress(boolean show) { 
    lockProgress.setVisibility(show ? View.VISIBLE : View.GONE); 
} 

private void dismissDialogIfNeeded() { 
    if (lockProgress.getVisibility() == View.GONE) { 
     // TODO: add conditions 
     dismiss(); 
    } 
} 

我顯示了在Fragment像這樣的對話:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    progressDialog = new RemoteProgressDialog(); 
} 

@Override 
public boolean onLongClick(View v) { 
    progressDialog.show(getFragmentManager(), REMOTE_PROGRESS_DIALOG); 
    progressDialog.showLockProgress(true); 
    return true; 
} 

起初,我嘗試使用AlertDialog.Builder建立對話,但我是越來越NullPointerException因爲之前showLockProgress()所以lockProgress沒有進行onCreateDialog()方法是空值。好吧,我不需要AlertDialog,所以我最終使用這種方法希望它能幫助解決問題。

不幸的是,它沒有幫助。當調用方法showLockProgress()時,lockProgress仍然爲空。我在和onCreateView()方法的DialogFragment以及onAttach()的主機Fragment中放置了一個斷點。 onAttach()中的那個被觸發,因此應創建DialogFragment的實例,但似乎不會調用onCreate()onCreateView()。當我長按按鈕時,showLockProgress()被調用,但lockProgress仍爲空。

爲什麼在創建對話框實例時或在我調用DialogFragment.show()方法後立即初始化視圖?

回答

2

所以我想的問題是,你的public方法onCreate之前調用等因爲調用showDialogFragment它需要時間來初始化的對話框,它的觀點和所有變量之後。因此,在我看來,以正確的方式處理這個問題的方式就是創建一個boolean變量,您在顯示DialogFragment之前設置了該變量。事情是這樣的:

​​

,您可以顯示前做這樣的事情你Dialog

progressDialog.show(getFragmentManager(), REMOTE_PROGRESS_DIALOG); 
progressDialog.setShowText(true); 

所以這樣你不會得到NullPointerException,並且取決於boolean你可以肯定這你設置的,你的TextViewRemoteProgressDialog將被隱藏或可見,當它被初始化。

希望這會有所幫助!

1

問題:

我認爲這個問題是您嘗試showLockProgress創建並顯示導致嘗試它分配之前訪問lockProgress的dialogFragment之前。

@Override 
public boolean onLongClick(View v) { 
    progressDialog.show(getFragmentManager(), REMOTE_PROGRESS_DIALOG); 
    progressDialog.showLockProgress(true); 
    return true; 
} 

這裏是當你執行該代碼會發生什麼:

  • 的DialogFragment的show法「是明確創建事務,與給定的標籤添加片段吧,犯了便利它「 - 它創建一個事務來添加一個片段並提交它。
  • 但是,當主線程準備就緒時,FragmentTransaction的commit方法實際上會在將來的某個時間點調度事務的提交。
  • onLongClick方法在主線程上執行,因此事務的實際提交(以及片段創建)計劃在此方法完成後的某個時間點發生。但在它裏面,你嘗試訪問stil未初始化的成員lockProgress(在showLockProgress之內)。

解決方案:

使用Android的開發者idea和實現視圖創建後,可用於顯示(或不)的進展情況(在onViewCreated例如)布爾成員。這樣,你只能從外部告訴DialogFragment它應該顯示進度(或不),但讓它在內部處理「何時」和「如何」。

相關問題