1.跑馬燈效果的Textview
<style name="pull_marquee_style">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:clickable">true</item>
<item name="android:ellipsize">marquee</item>
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:singleLine">true</item>
<item name="android:marqueeRepeatLimit">marquee_forever</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:textColor">@color/white</item>
<item name="android:textSize">12sp</item>
</style>
重點是<item name="android:singleLine">true</item>
這行改成<item name="android:lines">1</item>
的話就不行了。
2.RxJava與DataBinding共用的一個問題
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mUser = new User("Test", "User");
binding.setUser(mUser);
mUser.setFirstName("修改后1");
mService = getRetrofit().create(PullService.class);
MyParams params = new MyParams();
params.put("roomnumber", "123");
mService.getRoomInfo(params.get())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
new Action1<Bean>() {
@Override
public void call(Bean s) {
mUser.setFirstName("修改后2");
}
});
}
這樣寫的話,mUser這個變量數據雖然已經寫進去了,但是綁定的view不會更新的。暫時找不到很好的辦法,只能
new Action1<Bean>() {
@Override
public void call(Bean s) {
mUser.setFirstName("修改后2");
binding.textView.setText(s.getMsg());
}
});
這樣手動去設置一下了。
Edit:知道原因了,是需要ViewModel繼承BaseObservable的,如下:
public class User extends BaseObservable{
private String firstName;
private String lastName;
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
@Override
public String toString() {
return "User{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
分三步:1.繼承BaseObservable 2.為getter方法注解@Bindable 3.setter方法內寫notifyPropertyChanged(BR.xxx);之前沒這么寫是因為發現不用這樣寫也能出發UI變化,所以以為是新的sdk把操作簡化了,原來還是要按官網的操作來的。
3.還是DrawerLayout的抽屜全屏問題
找到了一個更好的方案,不在xml里設置-64dp,而是在代碼去動態讀取當前window的信息,然后設置抽屜部分的寬度為窗口的寬度就行了。如下:
/** * 由于官方的drawer定死了拉出時與另一邊的距離,在這個方法里使drawer布滿整個屏幕 */
private void drawerMaximize() {
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int windowsWight = metric.widthPixels;
View leftMenu = findViewById(R.id.nav_frag_container);
ViewGroup.LayoutParams leftParams = leftMenu.getLayoutParams();
leftParams.width = windowsWight;
leftMenu.setLayoutParams(leftParams);
}