我想使用TextView
在我的应用中记录一些操作。以下方法是不好的做法(有任何缺点吗?)
TextView tv = (TextView)findViewById(R.id.textView);
String s = "";
s = s + "Starting app...\n";
tv.setText(s);
...
s = s + "Doing action #1.\n";
tv.setText(s);
...
s = s + "Doing action #2.\n";
tv.setText(s);
在将新的日志记录信息附加到setText(s)
之后,是否有更好的方法来重做s
每次?
答案 0 :(得分:0)
这是一个非常干净的方法,即在android中使用DataBinding
。我将通过一个简短的例子说明你的用例最终会如何看待。
首先,要使用DataBinding
,您必须从应用的build.gradle启用它:
android {
dataBinding {
enabled = true
}
}
第二件事是创建一个包含日志消息的模型,这也是一种存储消息的简洁方式,而不是简单地附加到字符串。就我而言,我称之为Log
:
public class Log extends BaseObservable{
//This will be the message you wanna print
private String message;
@Bindable
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
//This would automatically update any binded views with this model whenever the message changes
notifyPropertyChanged(BR.message);
}
}
第三件事是更新包含您正在使用的TextView
的布局文件。基本上,我们会在布局中创建一个Log
变量,并告诉textView
从中读取消息并将其显示为文本。在我的示例中,activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="log"
type="com.riad.crypto.databinding.Log" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:textSize="18sp"
android:text="@={log.message}" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button_view"
android:gravity="bottom"/>
</LinearLayout>
现在简单地说,无论您想在哪里显示日志,都要创建一个Logger
对象并将其与textView
绑定。在我的示例中MainActivity
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Log logger = new Log();
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setLog(logger); //This is where we bind the layout with the object
Button button = (Button) findViewById(R.id.button_view);
logger.setMessage("1st log statement"); //You'll notice that the texview displays this message first
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
logger.setMessage("2nd log message"); //After button click, the texview would automatically change text to this. All you did was set the message
}
});
}
所以现在你可以在每次点击按钮时更改textView
,但是你可以在任何你想要的地方做到这一点。如果您需要不同类中的Log
对象,可以通过创建Singleton
或其他内容来改善这一点,但这仅适用于演示。
希望这有帮助!古德勒克