Предыдущие данные, показанные при использовании ConstraintSet - PullRequest
0 голосов
/ 07 мая 2020

Когда я создал ConstraintLayout в DialogFragment чисто программно, я обнаружил странное поведение. Когда я сохраняю предыдущий экземпляр и снова запускаю его с помощью frag.show (fm, tag), onCreateView DialogFragment снова выполняется с другим значением, но на экране отображается старое значение. Это зависит от использования ConstraintSet с теми же идентификаторами, что и в предыдущий раз. Если я использую View.generateViewId () каждый раз или не использую ConstraintSet, у меня нет этой проблемы. Тестовая программа находится здесь: https://rommel2.000webhostapp.com/testfragment.zip

Я использовал следующий код для DialogFragment:

package localhost.testfragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.fragment.app.DialogFragment;

public class MyDialogFragment extends DialogFragment {
    private static final String STRING = "string";
    String str;

    public MyDialogFragment() {
        super();
    }

    void setstr(String str) {
        this.str = str;
        Bundle args = new Bundle();
        args.putString(STRING, str);
        setArguments(args);
    }

    public static MyDialogFragment newInstance(String str) {
        MyDialogFragment fragment = new MyDialogFragment();
        fragment.setstr(str);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            str = getArguments().getString(STRING);

        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

    int[] id=new int[] { R.id.id0, R.id.id1, R.id.id2, R.id.id3 };
    ConstraintLayout layout = new ConstraintLayout(getActivity());
    layout.setId(id[0]);
    EditText ed = new EditText(layout.getContext());
    ed.setText(str);
    System.out.println("Use Text: "+str);
    layout.addView(ed, 0);
    EditText  ander= new EditText(layout.getContext());
    ander.setText("Another");
    layout.addView(ander, 1);
    EditText  nogeen= new EditText(layout.getContext());
    nogeen.setText("Text");
    layout.addView(nogeen, 2);
    ConstraintSet cset = new ConstraintSet();

    System.out.println("id[0]="+id[0]);

    ed.setId(id[1]);
    ander.setId(id[2]);
    nogeen.setId(id[3]);
    cset.connect(id[1], ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 0);
    cset.connect(id[1], ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
    cset.connect(id[1], ConstraintSet.RIGHT, id[2], ConstraintSet.LEFT, 0);
    cset.connect(id[2], ConstraintSet.LEFT, id[1], ConstraintSet.RIGHT, 0);
    cset.connect(id[2], ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
    cset.connect(id[2], ConstraintSet.RIGHT, id[3], ConstraintSet.LEFT, 0);
    cset.connect(id[3], ConstraintSet.LEFT, id[2], ConstraintSet.RIGHT, 0);
    cset.connect(id[3], ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
    cset.connect(id[3], ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
    cset.connect(id[3], ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0);
    for(int i=1;i<4;i++) {
        cset.constrainHeight(id[i], ConstraintSet.WRAP_CONTENT);
        cset.constrainWidth(id[i], ConstraintSet.WRAP_CONTENT);
        }
    cset.applyTo(layout);
    return layout;
    }
}

И следующий код для Activity:

package localhost.testfragment;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.lang.ref.WeakReference;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;

public class MainActivity extends AppCompatActivity {
static private String tag="frag";
private WeakReference<MyDialogFragment> weakfrag=null;

    void showfragment(String str) {
        FragmentManager fm = getSupportFragmentManager();
        MyDialogFragment frag = (MyDialogFragment) fm.findFragmentByTag(tag);

            if (frag==null&&(weakfrag == null || null == (frag = weakfrag.get()))) {
                frag = MyDialogFragment.newInstance(str);
                weakfrag = new WeakReference<>(frag);

            } else {
                System.out.println("reuse fragment");
                frag.setstr(str);
            }
        frag.show(fm, tag);
    }

@Override
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
   Button button1=findViewById(R.id.button1);
   button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showfragment("One"); } });
   Button button2=findViewById(R.id.button2);
   button2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showfragment("Two"); } });
   }

}
...