Регистрация информации в 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
или что-то, но это было только для демо.
Надеюсь это поможет! Удачи