2016-11-15 5 views
0

私は、ビューとその内容または状態を破壊することなく、Androidでアラートダイアログを使用しようとしています。内容を破壊することなくアラートダイアログビューを再利用

たとえば、いくつかの編集テキストフィールドを含むビューでダイアログを膨張させています。私はこれらのフィールドに値を入力してから、警告ダイアログを非表示にして、後で警告ダイアログを再び表示して、同じ状態にあるすべての値を表示します。

私のアプリケーションでは、ビューのコンテンツに関するコメントを(警告ダイアログを使用して)入力してから、メインビューに戻り、作業と読書を続け、コメントを追加する必要があります。私は変数やsqlite3データベースにこれらの値を保存することができます知っているしかし、私はちょうどそれを破壊せずにビューを保持することができますとそのような回避策のように感じると、私は再びダイアログを開いて、古いビューを置き換えてもう一度表示します。

私は次のことを試してみました:

//Class variables 

private AlertDialog.Builder builderSave = null; 
private LayoutInflater inflater = null; 
private View layout = null; 

//In my code where I create the dialog ... 

try { 
    if (builderSave == null) { 
     //inflate view for layout for the first time. 
     inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); 
     layout = inflater.inflate(R.layout.dialog_id_form, (ViewGroup) findViewById(R.id.layout_root)); 
     builderSave = new AlertDialog.Builder(mContext); 
     builderSave.setView(layout); 
    } else { 
     //niks 
    } 
} catch (Exception e) { 
    //daar was n nullpointer exception... 
} 

ダイアログに2回目表示しようとしたときにしかし、私はエラーを取得:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

答えて

0

しかし、本当にISNの間でデータを保存します回避策は標準的な動作にもっと似ています。あなたが実際にやろうとしていることは、Androidがビューを処理し、潜在的にメモリリークを引き起こす可能性のある回避策のように思えます。

あなたの問題は主にあなたのアプリケーションのアーキテクチャにあると考えられますか?たぶん、より多くのコードを提供して、アーキテクチャをより明確にすることができます。また、ダイアログを表示する間にデータを格納するのが難しいことがあるのはなぜでしょうか。

public class SomeViewModel { 

    private String myComment; 

    public String getMyComment() { 
     return myComment; 
    } 

    public void saveMyComment(String myComment) { 
     this.myComment = myComment; 
    } 

    // All other viewModel stuff 
} 

とビューのために:

public class SomeView extends Fragment { 

    private Dialog myDialog; 
    private SomeViewModel viewModel; 

    /* All the Fragment setup 
     * ... 
     * ... 
     */ 

    private void initDialog() { 
     /* Init Dialog relevant stuff 
      * ... 
      * ... 
      */ 

     myDialog.setOnDismissListener(new OnDismissListener() { 

      @Override 
      public void onDismiss(DialogInterface Dialog) { 
       final String newComment = "get comment from Dialog text field"; 
       viewModel.saveMyComment(newComment); 
      } 
     } 
    } 

    private void showDialog() { 
     final String previousComment = viewModel.getMyComment(); 
     if(previousComment != null) { 
      // Set as content on dialogs EditText 
     } 
     myDialog.show(); 
    } 
} 

私は概念的に、あなたの問題があると思います私はこのような何かをお勧めしたいMVVMのアプローチを使用して私の頭の上オフ

、ビューレイヤー/ビューステートの一部としてEditTextコンテンツが表示されます。ここでは、モデルレイヤー/データレイヤーに属している必要があると主張します。

+0

Daniel W、上記のお返事ありがとうございます。間違いなく私は素晴らしい議論をすることができると確信しています。正直言って、データをデータベースに保存して後で使用する方が好きです。 私は、ビューの状態を維持することがより理にかなっていると考える特定のケースがいくつかあります。アラートダイアログとメインビューは同じワーク/コンテキストを共有しているので、私の場合、ユーザーはメインビューを描画し、アラートダイアログで図面についてのコメントを作成しますが、メインビューに戻り、何が描かれたのか、その後、警告ダイアログに戻り、コメントをつけて続行します。 – Janpan

関連する問題