我想制作按钮来调整文字。有一些按钮可以使TextView在斜体和粗体之间变大,变小,来回。
我想编辑名为“text”的TextView
在下面的代码中,当我点击“butBig”或“butSmall”按钮时,两个按钮都做同样的事情,它使我的文字大小增加但不是5,它变得非常大。当我再次点击任一按钮时,TextView会消失,因为它对于框架来说太大了。
butBig.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
float size = text.getTextSize();
text.setTextSize(size + 5.0F);
}
});
butSmall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
float size = text.getTextSize();
text.setTextSize(size - 5.0F);
}
});
对于Italic和Bold,我的代码在这里工作,但有时当我点击其中任何一个按钮时,应用程序无缘无故崩溃..
butItalic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (text.getTypeface().getStyle() == Typeface.BOLD) {
text.setTypeface(null, Typeface.BOLD_ITALIC);
} else if (text.getTypeface().getStyle() == Typeface.ITALIC) {
text.setTypeface(null, Typeface.NORMAL);
} else if (text.getTypeface().getStyle() == Typeface.NORMAL) {
text.setTypeface(null, Typeface.ITALIC);
} else if (text.getTypeface().getStyle() == Typeface.BOLD_ITALIC) {
text.setTypeface(null, Typeface.BOLD);
}
}
});
butBold.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (text.getTypeface().getStyle() == Typeface.ITALIC) {
text.setTypeface(null, Typeface.BOLD_ITALIC);
} else if (text.getTypeface().getStyle() == Typeface.BOLD) {
text.setTypeface(null, Typeface.NORMAL);
} else if (text.getTypeface().getStyle() == Typeface.NORMAL) {
text.setTypeface(null, Typeface.BOLD);
} else if (text.getTypeface().getStyle() == Typeface.BOLD_ITALIC) {
text.setTypeface(null, Typeface.ITALIC);
}
}
});
请帮我解决这个问题
谢谢
编辑:这是我的logcat:)
---------崩溃的开始 11-05 05:34:17.581 2416-2416 / com.example.textadjust E / AndroidRuntime:FATAL EXCEPTION:main 处理:com.example.textadjust,PID:2416 java.lang.NullPointerException:尝试在空对象引用上调用虚方法'int android.graphics.Typeface.getStyle()' at com.example.textadjust.MainActivity $ 3.onClick(MainActivity.java:57) 在android.view.View.performClick(View.java:5198) 在android.view.View $ PerformClick.run(View.java:21147) 在android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:148) 在android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 11-05 05:34:19.734 2416-2416 /? I /处理:发送信号。 PID:2416 SIG:9
答案 0 :(得分:0)
到目前为止,您应该知道的是使用以下方法进行的TextSize的大小:
text.setTextSize(size + 5.0F);
尺寸单位是Scalled Pixels,如果您想知道或想要使用dp
中的尺寸,请将像素更改为dp
:
public int getDp(int px) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return dp;
}
在你的clas中添加此方法!但另外(我建议)您可以使用以下方法:
setTextSize(int unit, float size);
这里的参数int unit
我可以采用this stackoverflow answer给出的值:
TypedValue.COMPLEX_UNIT_PX //Pixels
TypedValue.COMPLEX_UNIT_SP //Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP //Device Independent Pixels
对于另一个问题,为崩溃添加一些日志!弄清楚可能是什么错误,我将编辑我的答案来添加!!
但我的建议到目前为止减少了条件并使用了switch
代替if
和else
,并确保TextView
在调用这些方法之前有文本。添加一些日志以确保最新进展!
编辑崩溃
正如我猜测崩溃的原因是NullPointerException
。这可能是由TextView
变量为null
引起的。可能的原因是它未在onCreate()
中分配,或者在分配时没有显示文本(我猜)。
解:
因为您要在整个类中使用TextView
将其声明为类变量,如果onCreate
或Activity
onCreateView
,则将其分配为Fragment
:
在任何方法之前就在你的课堂内:
private TextView text;
然后在onCreate
内将其指定为:
text=(TextView)findViewById(R.id.your_text_view_id); //Replace with a real id
并在Typeface
或xml
代码中设置默认文字或java
。现在,您可以在类中的任何位置访问TextView
变量null
。
作为性能和可读性的再次提示,请使用switch
代替if
和else
。