小编Nik*_*zic的帖子

从Fragment返回时,ViewModel onchange会被多次调用

我正在使用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 android-livedata

11
推荐指数
5
解决办法
7627
查看次数

LiveData如何知道房间数据库中何时更改数据?

我在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所有者数据已经改变了?

android mvvm

10
推荐指数
1
解决办法
3803
查看次数

OkHttp拦截器改造中的链对象是什么

我正在观看有关如何使用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 retrofit

6
推荐指数
2
解决办法
2433
查看次数

尝试在空对象引用上调用虚拟方法'void android.arch.lifecycle.MutableLiveData.setValue(java.lang.Object)'

我使用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)

android android-livedata

3
推荐指数
1
解决办法
4265
查看次数

为什么Android中的设备旋转后,Fragment中的onCreateView被调用两次?

我有简单的活动和片段交易。我注意到在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)

android rotation fragment

2
推荐指数
2
解决办法
1210
查看次数

BitmapFactory:无法解码流:java.io.FileNotFoundException:打开失败:ENOENT(没有这样的文件或目录)

我试图从有关 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)

java android bitmap

1
推荐指数
1
解决办法
5413
查看次数

标签 统计

android ×6

android-livedata ×2

bitmap ×1

fragment ×1

java ×1

mvvm ×1

retrofit ×1

rotation ×1