7

Quello che ho cercato di fare

Ho cercato di impostare l' layout_gravity tramite codice Java miei ImageButton, il modo in cui voglio il ImageButton da si presenta come il modo in cui all'interno del arancione fotogramma del figura:programmazione set ImageButton layout_gravity

image

il Blu telaio è un atto LinearLayout verticale come un formato "base" e questo è il layout ho provato aggiungere i layout figlio a.

Il arancione e Red sono entrambi orizzontale LinearLayout.

Il arancione il tracciato è il modo in cui voglio mettere il ImageButton e la TextView, questo è impostato tramite XML

The Red layout di è il risultato ho cercato di imitare il layout di Arancione tramite codice Java.

il relativo codice

Ecco il codice XML che ha istituito il layout di Arancione, questo è l'effetto che voglio raggiungere tramite codice Java:

 <!-- Begin the Orange Layout --> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="@dimen/info_left_padding" 
      android:layout_marginRight="@dimen/info_right_padding" > 

      <TextView 
       android:id="@+id/textView1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:gravity="center_vertical" 
       android:minHeight="@dimen/detail_min_line_item_height" 
       android:text="TextView" /> 

      <FrameLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" > 

       <ImageButton 
        android:id="@+id/imageButton1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="right|center_vertical" 
        android:adjustViewBounds="true" 
        android:maxHeight="@dimen/abs__action_bar_default_height" 
        android:scaleType="fitCenter" 
        android:src="@drawable/navigation_cancel" /> 
      </FrameLayout> 
     </LinearLayout> 

Ecco il codice Java che impostare il layout Red

 int textHeight = (int)getResources().getDimension(R.dimen.detail_min_line_item_height); 
     int imgHeight = (int)getResources().getDimension(R.dimen.abs__action_bar_default_height); 

     TextView mTextView = new TextView(this); 
     ImageButton mDeleteButton = new ImageButton(this); 

     // Set Delete Button Padding 
//  mDeleteButton.setPadding(buttonPadding, buttonPadding, buttonPadding, buttonPadding); 

     // Set Imagebutton Scale type as fitCentre 
     mDeleteButton.setScaleType(ScaleType.FIT_CENTER); 

     // Set AdjustViewBounds 
     mDeleteButton.setAdjustViewBounds(true); 

     // Set max height of the image 
     mDeleteButton.setMaxHeight(imgHeight); 

     // Set the text appearance to be "large" 
     mTextView.setTextAppearance(this, android.R.style.TextAppearance_Large); 
     mTextView.setText(text); 

     // Set the minimum height of this textview 
     mTextView.setMinHeight(textHeight); 

     // Set the content of the textview to be centred 
     mTextView.setGravity(Gravity.CENTER_VERTICAL); 

     // Set the ImageButton's background image 
     mDeleteButton.setImageResource(R.drawable.navigation_cancel); 

     LinearLayout.LayoutParams hParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 

     LinearLayout hLayout = new LinearLayout(this); 
     // Set Margins 
     hParams.leftMargin = (int) getResources().getDimension(R.dimen.info_left_padding); 
     hParams.rightMargin = (int) getResources().getDimension(R.dimen.info_right_padding); 
     hParams.bottomMargin = (int) getResources().getDimension(R.dimen.text_layout_margin); 

     hLayout.setLayoutParams(hParams); 
     // Set orientation to horizontal 
     hLayout.setOrientation(LinearLayout.HORIZONTAL); 

     // The settings below is actually setting up some of the button's parameters   
     LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     buttonParams.gravity = Gravity.RIGHT; 
     mDeleteButton.setLayoutParams(buttonParams); 

     hLayout.addView(mTextView); 
     hLayout.addView(mDeleteButton); 

     layout_blue.addView(hLayout); 

Quello che ho provato finora

Secondo alcuni SO post come questo: Java method for android:layout_gravity Inizialmente ho cercato di mettere prima la mia ImageButton in un FrameLayout quindi impostare le params di questo FrameLayout, come questo:

FrameLayout buttonFrame = new FrameLayout(this); 
FrameLayout.LayoutParams buttonParams = new FrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams.WRAP_CONTENT, 
                      android.widget.FrameLayout.LayoutParams.WRAP_CONTENT, 
                      Gravity.RIGHT | Gravity.CENTER_VERTICAL); 
buttonFrame.setLayoutParams(buttonParams); 
buttonFrame.addView(mDeleteButton); 

Ma ho avuto lo stesso risultato dell'immagine presentata sopra. Più tardi ho anche provato a cambiare la larghezza LayoutParams a MATCH_PARENT only to find the ImageButton` è stato allungato in orizzontale (Sì, è allungato)

Poi ho provato il metodo pubblicato in questi due SO messaggi:

How to set layout_gravity programmatically?

How to set a button's parameters programatically

il loro metodo è quello di istituire un LinearLayout.Params prima, quindi applicare questo params al pulsante (il codice che ho scritto in la sezione Codice correlati applica questo metodo). In breve è:

// The settings below is actually setting up some of the button's parameters   
    LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    buttonParams.gravity = Gravity.RIGHT; 
    mDeleteButton.setLayoutParams(buttonParams); 

Tuttavia, il risultato è stato sempre lo stesso come l'immagine presentata in precedenza.

Domanda

Da quando ho bisogno di aggiungere a livello di codice più viste bambino al Blue layout di tardi, mi chiedo se c'è un modo per impostare ogni layout bambino come il arancione uno nell'immagine?

At Last

ho trovato una soluzione che è abbastanza simile alla risposta @Permita s'.

Ecco la mia soluzione:

LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT); 
    textParams.weight = 1.0f; 
    mTextView.setLayoutParams(textParams); 
+0

+1 per bella domanda. –

risposta

1

Aggiungere il codice seguente, assegnerà tutto lo spazio disponibile a texView, spostando il pulsante sul lato destro del layout per farlo apparire come il orangeLayout.

mTextView.setLayoutParams(LayoutParams param = new LinearLayout.LayoutParams(
         LayoutParams.MATCH_PARENT, 
         LayoutParams.MATCH_PARENT, 1.0f)); 
+0

effettivamente ho trovato la soluzione che è abbastanza simile alla tua: 'LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams (0, LayoutParams.WRAP_CONTENT); \t \t textParams.weight = 1.0f; \t \t mTextView.setLayoutParams (textParams); ' – dumbfingers

0

Prova layout_width = layout_weight "0DP" = "1" per il TextView. Ciò indica a TextView di occupare l'intera larghezza disponibile, in modo che FrameLayout con ImageView si allinei al bordo destro.

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:gravity="center_vertical" 
     android:minHeight="@dimen/detail_min_line_item_height" 
     android:text="TextView" /> 
+0

Scusa ma temo che tu non abbia compreso completamente la mia domanda ... Sto provando a impostare un layout tramite codice Java per ottenere lo stesso risultato dell'XML. Il frame RED è il risultato che ho provato tramite codice Java e il frame ORANGE è l'effetto che voglio ottenere, che viene eseguito da XML senza alcun problema. – dumbfingers

0

Invece di usare lo standard LinearLayout, perché non provare a utilizzare il più complesso RelativeLayout? Con esso, puoi regolare le posizioni di ogni singola vista rispetto ad altre. È possibile impostare ImageButton nel layout arancione su android:layout_alignParentRight="true", che imposterà il pulsante sul lato destro del layout principale, lo RelativeLayout nel mio caso, ma lo LinearLayout nel proprio. Here è il collegamento alle guide API per i layout relativi sul sito Web degli sviluppatori Android.

Problemi correlati