2012-05-28 2 views
0

Скажем, у меня есть ListView с некоторыми формулами, как это:Как динамически добавлять компоненты в пользовательский диалог?

((A * 2 + B * 3 + PF * 5)/10) 

Когда я нажимаю на него, я хотел бы изменить письма EditTexts, поэтому я разделил этот String тогда, если это письмо, которое я должен замените его на EditText, поэтому, что я должен использовать, чтобы это произошло? Я имею в виду, могу ли я активировать активность в окне «Стиль диалога»? Или я могу сделать эту работу с помощью Simple Dialog?

Я попытался это, но он получает сообщение об ошибке при добавлении вида (NullPointerException)

lsView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

@Override 
public boolean onItemLongClick(AdapterView<?> aView, View view, 
      int i, long l) { 
    Dialog dialogFormula = new Dialog(NotasActivity.this); //"Parent" activity 

    dialogFormula.setTitle("Title"); 

    LinearLayout layout = (LinearLayout)findViewById(R.id.DialogLayout); 
    String[] lines = materias.get(i).getFormula().split(" "); 
    for (String s : lines) { 
     if (s.compareTo("PARTIC") == 0) { 
      EditText edtPartic = new EditText(dialogFormula.getContext)); 
      layout.addView(edtPartic); 
     } else if (s.contains("A") && s.compareTo("A") != 0) { 
     } else if (s.compareTo("B") == 0) { 
     } else if (s.compareTo("C") == 0) { 
     } else if (s.compareTo("D") == 0) { 
     } else if (s.compareTo("E") == 0) { 
     } else if (s.compareTo("F") == 0) { 
     } else if (s.compareTo("G") == 0) { 
     } else if (s.compareTo("H") == 0) { 
     } else if (s.compareTo("I") == 0) { 
     } else if (s.compareTo("PF") == 0) { 
    } 
       } 
    dialogFormula.setContentView(layout); 
    return false; 
} 
}); 

dialog_formula.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:id="@+id/DialogLayout"> 



<TextView 
    android:id="@+id/txtMateriaDialog" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 


<TextView 
    android:id="@+id/txtFormulaDialog" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

</LinearLayout> 
+0

Где макет объявлен в XML? Кроме того, какая ошибка вы получаете? Нулевой указатель? –

+0

Отредактировано с помощью информации – Markissimo

+0

Что вы пытаетесь сделать с этой строкой: 'LinearLayout layout = (LinearLayout) findViewById (R.id.DialogLayout);'? – Sam

ответ

1

Я предлагаю вам сделать диалоговое пользовательский класс.

public class FormulaDialog extends Dialog { 

    public FormulaDialog(Context c) { 
     super(c); 
     setTitle("Title"); 
     setContentView(R.layout.dialog_formula); 
    } 

    public void updateLayout(String[] lines) { 
     LinearLayout layout = (LinearLayout)findViewById(R.id.DialogLayout); 
     for (String s : lines) { 
      if (s.compareTo("PARTIC") == 0) { 
       EditText edtPartic = new EditText(dialogFormula.getContext)); 
       layout.addView(edtPartic); 
      } else if (s.contains("A") && s.compareTo("A") != 0) { 
      } else if (s.compareTo("B") == 0) { 
      } else if (s.compareTo("C") == 0) { 
      } else if (s.compareTo("D") == 0) { 
      } else if (s.compareTo("E") == 0) { 
      } else if (s.compareTo("F") == 0) { 
      } else if (s.compareTo("G") == 0) { 
      } else if (s.compareTo("H") == 0) { 
      } else if (s.compareTo("I") == 0) { 
      } else if (s.compareTo("PF") == 0) { 
      } 
     } 
    } 
} 

Тогда в вашей деятельности все, что вам нужно запустить это

String[] lines = materias.get(i).getFormula().split(" "); 
FormulaDialog mFormulaDialog = new FormulaDialog(this); 
mFormulaDialog.updateLayout(lines); 
mFormulaDialog.show(); 
+0

Спасибо, отлично работал! – Markissimo

0

findViewById() возвращает только взгляды в XML передается текущая функция ActivityContentView(), обычно это ваш main.xml для вашего первого действия. Поскольку DialogLayout находится в другой XML, эта строка возвращает нуль:

LinearLayout layout = (LinearLayout)findViewById(R.id.DialogLayout); 

Вы хотите надуть dialog_formula.xml, изменить его, а затем передать этот XML в диалоговом; как это:

View view = getLayoutInflater().inflate(R.layout.dialog_formula, null, false); 

LinearLayout layout = (LinearLayout) view.findViewById(R.id.DialogLayout); 
// Add your new EditTexts here 

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setTitle("Title"); 
builder.setView(view); 
dialog = builder.create(); 

Чтобы разобрать вашу формулу, у меня есть две различные рекомендации:

  • отслеживают количество пользовательских переменных для каждой формулы, а не грамматического разбора ту же строку снова и снова.
  • Если необходимо разобрать, проверить свою строку, как это:

    if("ABCDEFGHIPF".contains(s)) 
        // Add EditText 
    else if(s.contains("PARTIC")) 
        // Do something special 
    // The rest are numbers or symbols 
    
Смежные вопросы