在TextView中记录信息

时间:2017-12-10 20:36:12

标签: java android logging textview

我想使用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每次?

1 个答案:

答案 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或其他内容来改善这一点,但这仅适用于演示。

希望这有帮助!古德勒克