Регистрация информации в 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 ответ

Есть довольно чистый подход, который заключается в использовании 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 или что-то, но это было только для демо.

Надеюсь это поможет! Удачи

Другие вопросы по тегам