2015-01-05 15 views
19

Mam EditText wewnątrz AlertDialog. To wygląda tak.Dodaj większy margines do EditText w Android AlertDialog

enter image description here

Zobacz gdzie jest napisane tddjdjck i jak to jest wcięty całkiem sporo. Właśnie tego chcę (użyłem setPadding z lewym i prawym ustawieniem na 50), ale chcę też, aby pod tą linią również podświetlić niebieską linię. Jak mogę to zrobić?

Kod używam jest poniżej:

  final AlertDialog.Builder alert = new AlertDialog.Builder(thisActivity); 
      final EditText input = new EditText(thisActivity); 
      input.setSingleLine(); 
      input.setPadding(50, 0, 50, 0); 

      alert.setTitle("by..."); 
      alert.setMessage("enter the name of the person who did:"); 
      alert.setView(input); 
      alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        String value = input.getText().toString().trim(); 

       } 
      }); 

      alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        dialog.cancel(); 
       } 
      }); 
      alert.show(); 

Dziękuję

+1

zamiast wyściółka użycie layout_margin z lewej i prawej –

+0

Czy to w ten sposób. settext ("twój tekst \ n \ n"). Prosty i działa –

+0

Jaką funkcję mogę użyć do ustawienia layout_margin? – b85411

Odpowiedz

53
final AlertDialog.Builder alert = new AlertDialog.Builder(thisActivity); 
final EditText input = new EditText(thisActivity); 
input.setSingleLine(); 
FrameLayout container = new FrameLayout(thisActivity); 
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
params.leftMargin = getResources().getDimensionPixelSize(R.dimen.dialog_margin); 
input.setLayoutParams(params); 
container.addView(input); 
alert.setTitle("by..."); 
alert.setMessage("test message"); 
alert.setView(container); 

Upewnij się dodać kolejną linię do pliku zasobów dimens.xml, takich jak

<dimen name="dialog_margin">20dp</dimen> 
+0

Dzięki, że to naprawiono – b85411

+0

Niestety, zawijamy EditText do FrameLayout, ponieważ budowniczy niszczy layoutparams tego, co jest dodawane przez setView. Nie jest to taka droga sprawa, ale hierarchie widoków powinny być zawsze tak płaskie, jak to tylko możliwe. –

+0

Czy istnieje lepszy sposób niż kodowanie na sztywno marginesu? Czy w R istnieje podobna stała stylu, tak że margines tytułu i margines zawsze pozostają takie same? – Phil

11

Można podać parametr odstępu w metodzie setView

alert.setView(view ,left_space , top_space , right_space , bottom_space); 

Więc w twoim przypadku można spróbować to

alert.setView(input , 50 ,0, 50 , 0); 
+12

To jest przestarzałe dla nowszych interfejsów API – jensbrulmans

+3

@JensBrulmans, ale nadal działa bez wprowadzania kilkunastu dodatkowych linii kodu. – Bolein95

1

Oto Kotlin funkcja rozszerzenie dla Budowniczy ustawić widok EditText.

fun android.support.v7.app.AlertDialog.Builder.setEditText(editText: EditText): AlertDialog.Builder { 

    fun dpToPixel(dp: Float, context: Context): Float { 
     val resources = context.resources 
     val metrics = resources.displayMetrics 
     return dp * (metrics.densityDpi.toFloat()/DisplayMetrics.DENSITY_DEFAULT) 
    } 

    val container = FrameLayout(context) 
    container.addView(editText) 
    val containerParams = FrameLayout.LayoutParams(
      FrameLayout.LayoutParams.MATCH_PARENT, 
      FrameLayout.LayoutParams.WRAP_CONTENT 
    ) 
    val margins = 16F 
    containerParams.topMargin = dpToPixel(margins/2, context).toInt() 
    containerParams.leftMargin = dpToPixel(margins, context).toInt() 
    containerParams.rightMargin = dpToPixel(margins, context).toInt() 
    container.layoutParams = containerParams 

    val superContainer = FrameLayout(context) 
    superContainer.addView(container) 

    setView(superContainer) 

    return this 
} 

Przykład użycia

val editText = EditText(this) 
editText.hint = "Hint" 
AlertDialog.Builder(this) 
     .setTitle("Title") 
     .setEditText(editText) 
     .setPositiveButton("OK", { _: DialogInterface, _: Int -> 
      // Do your work with text here 
      val text = editText.text.toString() 
      Toast.makeText(applicationContext, text, Toast.LENGTH_SHORT).show() 
     }) 
     .setNegativeButton("Cancel", null) 
     .show() 

Wynik

Result