TextView - การตั้งค่าขนาดข้อความโดยทางโปรแกรมดูเหมือนจะไม่ทำงาน


140

ฉันใช้ Eclipse Indigo ทดสอบกับ 2 emulators (2.2 และ 3.0)

โค้ดด้านล่างแสดงสิ่งที่ฉันกำลังทดสอบในขณะนี้ แต่การตั้งค่าขนาดตัวอักษรไม่แสดงให้เห็นบนหน้าจอเมื่อพยายามเรียกใช้โปรแกรมจำลอง (ถ้าฉันใส่ขนาดตัวอักษรข้อความจะปรากฏขึ้นด้วยสีแดง) ฉันคิดว่าคราสไม่ได้สร้างรหัสขึ้นใหม่ แต่ฉันเพิ่มบรรทัดของรหัสเพื่อเพิ่มพื้นหลังสีน้ำเงินและใช้งานได้ ฉันลองตั้งค่าขนาดตัวอักษรหลังจากตั้งค่าข้อความโดยที่ยังไม่สำเร็จ รหัสด้านล่าง ขอบคุณสำหรับความช่วยเหลือของคุณ! (ข้อจำกัดความรับผิดชอบ) - ฉันพยายามอยู่ห่างจาก xml เป็นที่ฉันรู้แล้ว java ฉันไม่ต้องการที่จะขึ้นอยู่กับว่า

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

public class TestAndroidvs2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView text = new TextView(this);
    text.setTextColor(Color.RED);
    text.setTextSize(2);    
    text.setBackgroundColor(Color.BLUE);
    text.setText("Hello Android");


    setContentView(text);
  }
}

คำตอบ:


19

ขนาดตัวอักษร 2 จะมองไม่เห็นจริง ลองด้วย 14 อย่างน้อย BTW โดยใช้ xml มีข้อดีมากมายและจะทำให้ชีวิตของคุณง่ายขึ้นเมื่อคุณต้องทำอะไรที่ซับซ้อนกว่า 'Hello World'


ฉันจะลองด้วย 14 อย่างที่ฉันพูดไว้ในโพสต์แรก - แม้ว่า 2 มีขนาดเล็กเกินไปมันไม่ควรทำให้หน้าจอว่างเปล่า ฉันเดาว่าฉันอ่านมันเป็นสเกลมากกว่าสิ่งที่ข้อความนั้นเป็นอยู่แทนที่จะเป็นแค่การกำหนดขนาด - ฉันจะดู แต่ฉันจะถามต่อไป - ขนาดเริ่มต้นคืออะไร อย่างไรก็ตามขอบคุณ
cspam

btw - ใช่ฉันรู้ว่า xml สามารถมีข้อได้เปรียบ แต่ฉันไม่มีประสบการณ์ ใช่ฉันรู้ว่ามันอาจเป็นเรื่องง่ายที่จะเรียนรู้ เนื่องจากฉันคุ้นเคยกับจาวาอยู่แล้วฉันแค่คิดว่ามันจะมีประโยชน์จริง ๆ ที่จะคุ้นเคยกับคลาสมากที่สุดเท่าที่จะเป็นไปได้ ดูเหมือนว่าการใช้การเรียงลำดับ XML จะซ่อนสิ่งนั้นไว้มากมายจากคุณ
cspam

มันไม่ได้ซ่อนมัน - มันเป็นคลาสเดียวกันที่มีพารามิเตอร์เดียวกัน ใช้เวลาสักครู่หนึ่งในการแปลระหว่างทั้งสอง แต่จริงๆแล้วมันมีประสิทธิภาพมาก เป็นโบนัสถ้าคุณกำหนดมุมมองใน XML ระบบจะดูแลขนาดหน้าจอความหนาแน่นและทิศทางที่แตกต่างกันโดยไม่จำเป็นต้องเปลี่ยนรหัสของคุณเพียงแค่ไฟล์เลย์เอาต์
Nikolay Elenkov

คุณจะสามารถเปลี่ยนเลย์เอาต์และทิศทางในเวลาทำงานโดยพิจารณาจากปัจจัยหลาย ๆ
cspam

นั่นเป็นคำถามที่กว้างมาก แต่ในระยะสั้นใช่ แม้ว่าคุณจะกำหนด UI ของคุณใน XML คุณยังสามารถเพิ่ม / ลบมุมมองในขณะใช้งาน นอกจากนี้คุณยังสามารถแทนที่พฤติกรรมเริ่มต้นและจัดการการวางแนวการเปลี่ยนแปลงด้วยตัวเอง
Nikolay Elenkov

535

วิธีการTextView.setTextSize(int unit , float size);ใช้สองพารามิเตอร์

ลองสิ่งนี้:

text.setTextSize(TypedValue.COMPLEX_UNIT_SP,14);

อ้างนี้และนี้

อัปเดต: ตอนนี้setTextSize(float size)จะตั้งค่าขนาดข้อความโดยอัตโนมัติในscaled pixelหน่วย "" ไม่จำเป็นต้องพูดถึง COMPLEX_UNIT_SP ด้วยตนเอง อ้างถึงเอกสาร


36
นี่คือคำตอบที่ถูกต้อง โดยเฉพาะอย่างยิ่ง: float myTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18F, context.getResources().getDisplayMetrics());
Brill Pappin

2
ขอบคุณมาก!
DmitryKanunnikoff

72

ปัญหานี้ได้รับการแก้ไขสำหรับฉัน ฉันมีขนาดตัวอักษรที่เหมือนกันในทุกอุปกรณ์

 textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimension(R.dimen.font));

หมายเลขเครื่องแบบ R.dimen.font หรือคุณมีขนาดต่างกันสำหรับอุปกรณ์ที่แตกต่างกันหรือไม่?
The_Martian

ในกรณีของฉันฉันประกาศตัวอักษรในไฟล์ dimen.xml ในโฟลเดอร์เหล่านี้: values, values-sw600dp, values-sw720dp ด้วยค่าเฉพาะ
Vikas

มันแปลกที่ TextView หายไปหลังจาก textView.setTextSize (R.dimen.text_size_max) ที่เรียกว่า แต่ใช้วิธีการของคุณมันใช้งานได้
li2

ได้ผลสำหรับฉัน ขอบคุณ!
apurv thakkar

24

ปัจจุบันsetTextSize(float size)วิธีการทำงานได้ดีดังนั้นเราไม่จำเป็นต้องใช้วิธีอื่นในการเปลี่ยนขนาดตัวอักษร

รหัสที่มาandroid.widget.TextView.java

/**
 * Set the default text size to the given value, interpreted as "scaled
 * pixel" units.  This size is adjusted based on the current density and
 * user font size preference.
 *
 * <p>Note: if this TextView has the auto-size feature enabled than this function is no-op.
 *
 * @param size The scaled pixel size.
 *
 * @attr ref android.R.styleable#TextView_textSize
 */
@android.view.RemotableViewMethod
public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

ตัวอย่างการใช้

textView.setTextSize(20); // set your text size = 20sp

เชื่อมโยงไปยังแหล่งข้อมูล AOSP TextView: github.com/aosp-mirror/platform_frameworks_base/blob/…
อัลเบิร์ตวิลาคาล

12

โปรดดูลิงค์นี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าขนาดตัวอักษรในรหัส โดยทั่วไปมันบอกว่า:

โมฆะสาธารณะ setTextSize (หน่วย int ขนาดลอย)

ตั้งแต่: ระดับ API 1 ตั้งค่าขนาดข้อความเริ่มต้นเป็นหน่วยและค่าที่กำหนด ดูTypedValueสำหรับหน่วยมิติที่เป็นไปได้ คุณสมบัติ XML ที่เกี่ยวข้อง

android: textSize Parameters

หน่วยหน่วยมิติที่ต้องการ
ขนาดขนาดที่ต้องการในหน่วยที่กำหนด


1
ฉันเพิ่งตรวจสอบสองครั้งใน Eclipse ในรหัสของฉันและตาม IntelliSense ฉันมี 2 ตัวเลือกในการ setTextSize, setTextSize (ขนาดลอย), setTextSize (หน่วย int ขนาดลอย) เอกสารที่คุณเชื่อมโยงยืนยันนี้
cspam

ถูก - คุณลองไหม Nikolay ยังบอกว่า 2 จะเป็นทางเล็กให้ดูลองเพิ่มขึ้นเช่นกัน
แจ็ค

ใช่ แต่ปัญหาคือเมื่อฉันพยายามทำอย่างที่ฉันมีตอนนี้ข้อความไม่ปรากฏขึ้น มันเป็นเพียงหน้าจอที่ว่างเปล่า แม้ว่า 2 ไม่สังเกตเห็นได้ว่าทำไมหน้าจอถึงว่างเปล่า?
cspam

มันไม่ว่างเปล่า หากคุณดูใกล้ ๆ คุณจะเห็นพิกเซลสีแดงเล็กน้อย :) เพิ่มขนาดให้ค่อย ๆ ดู
Nikolay Elenkov

และโดยวิธีการ setTextSize (float) เทียบเท่ากับ setTextSize (COMPLEX_UNIT_SP, float)
Nikolay Elenkov

10

ในกรณีของฉันใช้วิธีนี้:

public static float pxFromDp(float dp, Context mContext) {
    return dp * mContext.getResources().getDisplayMetrics().density;
}

ที่นี่ตั้งค่าTextSize TextSize โดยทางโปรแกรม :

textView.setTextSize(pxFromDp(18, YourActivity.this));

เพลิดเพลินไปกับ :)


สวัสดี @Dhruv Raval ฉันกำลังเลือกที่จะปรับขนาดแบบอักษรในโครงการของฉันในกรณีที่ค่า 18 นี้ใช้ได้กับความหนาแน่นของหน้าจอใด ๆ หรือฉันควรสร้างมิติสำหรับแต่ละหน้าจอหรือไม่
Armando Marques Sobrinho
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.