ตั้งค่าน้ำหนักโครงร่างของ TextView โดยทางโปรแกรม


214

ฉันพยายามที่จะสร้างแบบไดนามิกวัตถุและเพิ่มพวกเขาไปTableRow วัตถุมี 2 รายการที่เป็นและ รายการจะต้องมีการตั้งค่ารูปแบบของพวกเขาน้ำหนักถึง 1 ที่จะผลักดันรายการไปขวาสุดTableLayoutTableRowTextViewCheckBoxTextViewCheckBox

ฉันไม่สามารถหาเอกสารเกี่ยวกับวิธีการตั้งค่าน้ำหนักโครงร่างของTextViewรายการโดยทางโปรแกรม

คำตอบ:


355

คุณต้องใช้TableLayout.LayoutParamsกับสิ่งนี้:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

พารามิเตอร์สุดท้ายคือน้ำหนัก


15
ฉันไม่ได้พูดถึงเรื่องนี้มาก่อนดังนั้นฉันขอโทษ แต่ฉันลองก่อนที่จะถามคำถามของฉัน มันทำให้ TextView หายไปจากเลย์เอาต์ แต่ในแง่บวกฉันพบว่าการตั้งค่าคุณสมบัติ stretch_columns ของ TableLayout เป็น 0 ทำให้เกิดเอฟเฟกต์ที่ฉันกำลังมองหา (TextView ทางด้านซ้ายทำเครื่องหมายที่ช่องด้านขวา) ขอบคุณสำหรับความช่วยเหลือ
eugene

8
หากคุณกำลังนำเข้าเค้าโครง XML และคุณไม่ได้สร้างเค้าโครงของคุณแบบไดนามิกคุณสามารถคว้ามันได้เช่นนี้:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski

5
น้ำหนักในการตั้งรูปแบบการเขียนโปรแกรม, ควรจะนำมาใช้แทนTableRow.LayoutParams TableLayout.LayoutParamsดูคำตอบของ @ Dorje
Halil

นำเข้า android.widget.LinearLayout; นำเข้า android.widget.TableLayout;
Prakash

1
โปรดทราบว่าคนส่วนใหญ่จะใช้ 0 เป็นพารามิเตอร์ตัวแรกหรือตัวที่สอง (ขึ้นอยู่กับว่าแนวนอนหรือแนวตั้ง) และไม่ใช่ WRAP_CONTENT เนื่องจากสิ่งที่พวกเขากำลังมองหาคือการตั้งค่าน้ำหนัก
FlorianB

97

คำตอบคือคุณต้องใช้ TableRow.LayoutParams ไม่ใช่ LinearLayout.LayoutParams หรือ LayoutParams อื่น ๆ

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

LayoutParams ที่แตกต่างกันนั้นไม่สามารถใช้แทนกันได้และหากคุณใช้ผิดสิ่งนั้นก็ดูเหมือนจะไม่มีอะไรเกิดขึ้น พาเรนต์ของมุมมองข้อความคือแถวของตารางดังนั้น:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html


คำตอบนี้ช่วยฉันได้มาก ... TableLayout ไม่ได้ผลสำหรับฉัน
sham.y

โอ้มนุษย์คุณช่วยฉันเวลามาก มันระบุไว้ที่ไหน? ฉันไม่พบสิ่งใดในเอกสารเกี่ยวกับคุณที่ไม่สามารถแลกเปลี่ยนได้LayoutParams
Adrien Cadet

TableRow.LayoutParamsทำงานให้ฉันด้วย
Menelaos Kotsollaris

6
ส่วนสำคัญของคำตอบนี้คือ 0
Leon

มันจะลดเวลาการทำงานของฉันฉันกำลังค้นหาสิ่งนี้เป็นเวลานานวิธีแก้ปัญหาที่ยอดเยี่ยมมาก
SIVAKUMAR.J

38

ในคำตอบก่อนหน้าน้ำหนักจะถูกส่งผ่านไปยังตัวสร้างของวัตถุ SomeLayoutType.LayoutParams ใหม่ ในหลาย ๆ กรณียังมีความสะดวกในการใช้วัตถุที่มีอยู่ - ช่วยในการหลีกเลี่ยงการจัดการกับพารามิเตอร์ที่เราไม่สนใจ

ตัวอย่าง:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);

loparams อาจเป็นค่า NULL ดังนั้นโปรดตรวจสอบให้แน่ใจก่อนที่จะโทรไปที่ setLayoutParams ()
AAgg

@ AAgg ไม่ใช่ในสถานการณ์จริง ดูจะไม่พองถ้ามันไม่ได้ตั้งค่าความกว้างและความสูง แต่ฉันเห็นด้วย - เป็นวิธีปฏิบัติที่ดีในการตรวจสอบเมื่อมีข้อสงสัยเกี่ยวกับการเป็นโมฆะ
sberezin

16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f หมายถึงน้ำหนัก = 1; คุณสามารถให้ 2f หรือ 3f ดูจะย้ายการเข้ารหัสไปยังพื้นที่


12

เพียงตั้งค่า params เลย์เอาต์ในรูปแบบนั้น

สร้างตัวแปรพารามิเตอร์

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f คือตัวแปรน้ำหนัก

ตั้งค่าวิดเจ็ตหรือเลย์เอาต์ของคุณเช่น

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);

คุณได้รับข้อมูลนี้ที่ 1f หมายถึงตัวแปรน้ำหนักที่ไหน กรุณาให้ลิงค์
hayonj

@hayonj เพียงตรวจสอบแหล่งที่มาของตัวLinearLayout.LayoutParamsสร้าง พารามิเตอร์ที่สามคือน้ำหนัก หรือเอกสาร
mente

11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(หรือ)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f ถูกอ้างถึงเป็น weight = 1; ตามความต้องการของคุณคุณสามารถให้ 2f หรือ 3f มุมมองจะย้ายการเข้ารหัสไปยังพื้นที่ สำหรับการกำหนดระยะห่างระหว่างมุมมองใน Linear Layout ให้ใช้weightsumสำหรับ "LinearLayout"

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);

8

สิ่งนี้ควรใช้กับคุณ

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;

7

คุณสามารถให้น้ำหนักแบบแยกกันได้เช่นนี้

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;

6

งานนี้สำหรับฉันและฉันหวังว่าจะได้ผลกับคุณเช่นกัน

ตั้งค่า LayoutParams สำหรับมุมมองพาเรนต์ก่อน:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

จากนั้นตั้งค่าสำหรับ TextView (ลูก):

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 

1

มีวิธีอื่นในการทำเช่นนี้ ในกรณีที่คุณจำเป็นต้องตั้งค่าพารามิเตอร์เดียวเท่านั้นเช่น 'height':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);

1

หลังจากดิ้นรนเป็นเวลา 4 ชั่วโมง ในที่สุดรหัสนี้ทำงานสำหรับฉัน

3 คอลัมน์อยู่ในแถว

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

-1

ฉันมีปัญหาเล็กน้อยในการแก้ปัญหาบางอย่างที่คล้ายกันมาก: พยายามมีสองปุ่มใน TableRow โดยแต่ละอันมีความกว้างครึ่งหนึ่งของหน้าจอ ไม่ว่าด้วยเหตุผลใดปุ่มซ้ายจะมีความกว้างประมาณ 70% และปุ่มขวา 30% การเรียก table_layout.setStretchAllColumns (จริง) ไม่มีผลและไม่ตั้งค่าความกว้างของปุ่มครึ่งหน้าจอหรือตั้งค่าน้ำหนักโครงร่าง

วิธีการแก้ปัญหาฉันสิ้นสุดกับถูกรัง LinearLayout ใน TableRows ซึ่งไม่คำนึงถึงความคุ้มค่าของความกว้างของปุ่มฯ

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }

1
เพียงเพื่อให้คุณรู้ว่าในอนาคตการแก้ปัญหาคือการตั้งค่า TableRow, Button1 และ Button2 ให้ทุกคนมีlayout_width=fill_parentและหลังจากนั้นให้ตั้งค่าlayout_weight=1สำหรับทั้ง button1 และ button2 องค์ประกอบทั้งหมดที่มี fill_parent และ layout_weight = 1 จะได้รับขนาดเท่ากันตามอัตราเงินเฟ้อ
edthethird
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.