7

Was ich

ich versuchte zu tun versucht, mein ImageButton ‚s layout_gravity über Java-Code zu setzen, will, dass die Art, wie ich die ImageButton auf die Art, wie in dem in die orange Rahmen präsentiert wird Abbildung unten:gesetzt Programmatically Image layout_gravity

image

die Blau Rahmens ist eine vertikale LinearLayout wirken als „Basis“ Layout und das ist das Layout ich versucht um untergeordnete Layouts hinzuzufügen.

Die orange und Red beide horizontal LinearLayout.

Das orange Layout ist die Art, wie ich die ImageButton und die TextView, dieser setzen will über XML

Das Red Layout ist das Ergebnis, das ich versuchte zu imitieren das orange Layout einrichten über Java-Code.

Der zugehörige Code

Hier ist der XML-Code, den das orange Layout einrichten, dies ist der Effekt ich über Java-Code erreichen will:

 <!-- 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> 

Hier ist der Java-Code, einrichten des Red Layout

 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); 

Was ich

Nach einigen zu veröffentlichen, so wie dies bisher versucht habe: Java method for android:layout_gravity Ich versuchte zunächst, zuerst ein FrameLayout legte meine ImageButton in dann die params setzte diese FrameLayout, wie folgt aus:

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); 

Aber ich hatte das gleiche Ergebnis wie das oben dargestellte Bild. Später habe ich versucht, auch die LayoutParams Breite zu verändern only to find the ImageButton` MATCH_PARENT gestreckt wurde horizontal (Ja, es ist gestreckt)

Dann habe ich versucht, das Verfahren in diesen beiden SO Posts:

How to set layout_gravity programmatically?

How to set a button's parameters programatically

Ihre Methode ist, zuerst eine LinearLayout.Params einzurichten, wenden Sie dann diese Parameter auf die Schaltfläche an (der Code, den ich in gepostet hat, der verwandte Code Abschnitt wendet diese Methode an). Kurz gesagt ist es:

// 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); 

Allerdings war das Ergebnis immer noch das gleiche wie das Bild oben dargestellt.

Frage

Da muß ich programmatisch mehr Kind Blick auf das Blau später Layout hinzufügen, ich frage mich, ob es eine Möglichkeit gibt, jedes Kind Layout wie die orange einen in dem Bild einzurichten?

At Last

fand ich eine Lösung, die auf @Permita ‚s Antwort ganz ähnlich ist.

Hier ist meine Lösung:

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

+1 für nette Frage. –

Antwort

1

Fügen Sie den folgenden Code hinzu, er wird den gesamten verfügbaren Platz dem texView zuweisen, indem er den Button auf die rechte Seite des Layouts verschiebt, damit er wie orangeLayout erscheint.

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

tatsächlich habe ich die Lösung gefunden, die Ihrer ganz ähnlich ist: 'LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams (0, LayoutParams.WRAP_CONTENT); \t \t textParams.weight = 1.0f; \t \t mTextView.setLayoutParams (textParams); ' – dumbfingers

0

Try layout_width = "0DP" layout_weight = "1" für die Textview. Dadurch wird TextView angewiesen, die gesamte verfügbare Breite zu belegen, sodass FrameLayout mit ImageView an der rechten Grenze ausgerichtet wird.

<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

Tut mir leid, aber ich fürchte, Sie haben meine Frage nicht vollständig verstanden ... Ich versuche, ein Layout über Java-Code einzurichten, um das gleiche Ergebnis wie XML zu erzielen. Der RED-Frame ist das Ergebnis, das ich über Java-Code ausprobiert habe, und der ORANGE-Frame ist der Effekt, den ich erreichen möchte, was von XML ohne Probleme erledigt wird. – dumbfingers

0

Statt der Standard-LinearLayout zu verwenden, warum nicht versuchen, die komplexere RelativeLayout zu benutzen? Damit können Sie die Positionen jeder einzelnen Ansicht relativ zu anderen anpassen. Sie können die ImageButton im orangefarbenen Layout auf android:layout_alignParentRight="true" setzen, die die Schaltfläche an der rechten Seite des übergeordneten Layouts, die RelativeLayout in meinem Fall, aber die LinearLayout in Ihrem gesetzt wird. ist der Link zu den API-Handbüchern für Relative Layouts auf der Android-Website für Entwickler.