Когда я создал 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"); } });
}
}