我正在使用Android架构组件.我想要的是当用户在Edittext中键入"0"并单击按钮以将Fragment替换为新的,并且如果键入任何其他内容后发布Toast错误消息.在问题是当我从新的Fragment(BlankFragment)返回并再次单击按钮并再次输入"0"并单击时,onchange()被多次调用,因此片段被多次创建
FragmentExample.class:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
manager = getActivity().getSupportFragmentManager();
viewmModel = ViewModelProviders.of(getActivity(), viewModelFactory)
.get(VModel.class);
View v = inflater.inflate(R.layout.fragment_list, container, false);
b = (Button) v.findViewById(R.id.b);
et = (EditText) v.findViewById(R.id.et);
viewmModel.observeData().observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
if(s.equals("0")) {
BlankFragment fragment = (BlankFragment) manager.findFragmentByTag(DETAIL_FRAG);
if (fragment == null) {
fragment = BlankFragment.newInstance();
}
addFragmentToActivity(manager,
fragment,
R.id.root_activity_detail,
DETAIL_FRAG
);
} else {
Toast.makeText(getContext(), "Wrong text", Toast.LENGTH_SHORT).show();
}
}
});
b.setOnClickListener(new View.OnClickListener() {
@Override …Run Code Online (Sandbox Code Playgroud) 我在android中学习Mvvm模式,我不明白一件事.实时数据如何知道房间数据库中数据何时发生变化?我有这个代码:
分段:
newUserViewModel.getListItemById(itemId).observe(this, new Observer<User>() {
@Override
public void onChanged(@Nullable User user) {
tv.setText(user.getName());
}
});
Run Code Online (Sandbox Code Playgroud)
查看型号:
public LiveData<User> getListItemById(String itemId){
return repository.getListItem(itemId);
}
Run Code Online (Sandbox Code Playgroud)
库:
public LiveData<User> getListItem(String itemId){
return userDao.getUSerByID(itemId);
}
Run Code Online (Sandbox Code Playgroud)
DAO:
@Query("SELECT * FROM User WHERE itemId = :itemId")
LiveData<User> getUSerByID(String itemId);// When this query gets executed and how live Data knows that our Table is changed?
Run Code Online (Sandbox Code Playgroud)
假设我们在数据库中插入了新用户.什么@Query("SELECT * FROM User WHERE itemId = :itemId")时候在我们的数据库中有新数据时执行?)以及LiveData如何知道我们在表中有新用户和回调Observer所有者数据已经改变了?
我正在观看有关如何使用OkHttp拦截器添加标头的信息,但是我对几件事感到困惑。
; Chain对象是什么?Request original = chain.request()的作用是什么,chain.proceed(request)的返回作用是什么?
码:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", "auth-value");
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
OkHttpClient client = httpClient.build();
Run Code Online (Sandbox Code Playgroud) 我使用Android体系结构组件,并尝试实例化viewmodel和从LiveData观察数据。但是我收到以下错误:
ActivationFragment.clas:
@OnClick(R.id.btn_activation)
public void onEvaluateClick(Button v) {
maActivationCode = etActivation.getText().toString();
mActiationViewModel.getsatusCode(maActivationCode).observe(this, new Observer<Boolean>() {
@Override
public void onChanged(@Nullable Boolean aBoolean) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
ActivationViewModel类:
public class ActivationViewModel extends ViewModel{
public ActivationRepository activationRepository;
public ActivationViewModel(ActivationRepository activationRepository) {
this.activationRepository = activationRepository;
}
public LiveData<Boolean> getsatusCode(String activationCode) {
return (LiveData<Boolean>) activationRepository.getStatusCode(activationCode);
}
Run Code Online (Sandbox Code Playgroud)
}
ActivationRepository类:
public class ActivationRepository {
public MutableLiveData<Boolean> status;
public MutableLiveData<Boolean> getStatusCode(String activationCode) {
status.setValue(Boolean.valueOf(false));
return status;
}
Run Code Online (Sandbox Code Playgroud) 我有简单的活动和片段交易。我注意到在Fragment的oncreateView上的配置更改被两次调用。为什么会这样呢?
活动代码在这里:
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("Activity created");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
BlankFragment fragment = new BlankFragment();
addFragmentToActivity(manager,
fragment,
R.id.root_activity_create
);
}
public static void addFragmentToActivity (FragmentManager fragmentManager,
Fragment fragment,
int frameId)
{
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
片段代码在这里:
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, …Run Code Online (Sandbox Code Playgroud) 我试图从有关 BitMapFactory.decodeFile 的文件路径获取图片,以在 Canvas 中绘制位图并得到此异常:
Unable to decode stream: java.io.FileNotFoundException:
/content:/media/external/images/media/40: open failed: ENOENT (No such file
or directory)
02-02 10:03:19.793 3371-3371/com.group.digit.razvoj.appointment
E/AndroidRuntime: FATAL EXCEPTION: main
Run Code Online (Sandbox Code Playgroud)
但是当我使用该文件路径在片段中设置图像时,它工作正常。
这是我的代码:
String urilogo = helper.getUri();
File imgFile = new File(urilogo);
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
在它起作用的片段中:
String urilogo = helper.getUri();
if(urilogo!= null || urilogo!= "") {
imageView.setImageURI(Uri.parse(urilogo));
}
Run Code Online (Sandbox Code Playgroud)