android EditText Settext无法使用片段

dnph8jn4  于 2023-05-12  发布在  Android
关注(0)|答案(8)|浏览(94)

我有一个屏幕的3个状态的片段;添加、编辑和查看。在“添加”中,我创建一个实体并保存它。下次我在视图模式下打开它并使用

EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());

我从视图模式中单击编辑按钮以打开编辑模式。我在此处更改实体名称并保存它。这将我带回到视图屏幕。但我发现实体名称没有更新。我调试并发现entity.getEntityname()具有正确的值。我不知道为什么编辑文本不采用新值。
有什么想法吗
注意:我使用的是android版本2.2

pbgvytdp

pbgvytdp1#

EditText似乎在onCreateView中重置文本时出现问题。所以这里的解决方案是重置onResume中的文本。这个管用
此外,onActivityCreated中也存在一个问题。我在onStart中重置了edittext的内容,它工作了。(来源:@savepopulation)

qlvxas9a

qlvxas9a2#

Android中有一些View类应该在容器分离时保存它们的状态。应在View.onSaveInstanceState()之前调用Fragment.onViewCreated()。因此,如果在方法Fragment.onViewCreated()中设置一个值。应该在方法View.onRestoreInstanceState(Parcelablestate)中清除该值。
例如TextView、RecyclerView等类,可以阅读www.example.com的代码TextView.java:

public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    // Save state if we are forced to
    final boolean freezesText = getFreezesText();
    boolean hasSelection = false;
    int start = -1;
    int end = -1;
    ....
    if (freezesText || hasSelection) {
        SavedState ss = new SavedState(superState);
        ....
    }
    ....
   }

有两个参数来控制是否保存状态:“freezesText”和“hasSelection”。无法选择TextView,因此hasSelection为false。函数getFreezesText()在类TextView中也返回false。因此,TextView不会保存状态。www.example.com的代码EditText.java:

@Override
    public boolean getFreezesText() {
    return true;
    }

EditText返回true,因此EditText应该保存状态。
有一些方法来修复这个bug:
1.实现EditText.getFreezesText()并返回false,清除EditText中的select状态
2.实现EditText的onSaveInstanceState,返回null.like this:

public Parcelable onSaveInstanceState() {
      super.onSaveInstanceState();
     return null;
 }

3.use EditText.setSaveEnable(false);
4. add param in xml“saveEnable='false'”

wn9m85ua

wn9m85ua3#

如前所述,EditText似乎在onCreateView中重置文本时存在问题。
这是因为一旦创建了一个片段,直到我们将其从backstack中删除,它的onResume方法将被调用,因为视图不会再次创建。
所以这里的解决方案是在onResume中重置文本。这将工作在所有的时间,即使u锁定和解锁ur屏幕,而该片段是开放的,或你回来从另一个片段
但是,如果你从一个包中设置这个数据,最好把这个值保存在一个示例变量中,因为这个包可能会变成空的,你可能会得到空指针问题

46qrfjad

46qrfjad4#

根据@TusharVengrulekar的说法,这就是你必须实现你的片段的方式

public class ActionBar extends Fragment {

private TextView lbl_title;
private String title;

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

    View view = inflater.inflate(R.layout.fragment_action_bar, container, false);
    title = "Contacts";
    lbl_title = (TextView) view.findViewById(R.id.lbl_title);

    return view;
}

@Override
public void onStart(){
    super.onStart();

    lbl_title.setText(title);
}

@Override
public void onResume(){
    super.onResume();
}
}<!---->
w3nuxt5m

w3nuxt5m5#

onActivityCreated中也有一个问题。我在onStart中重置edittext的内容,它可以工作。

rdrgkggo

rdrgkggo6#

这将在片段上100%工作

override fun onResume() {
    super.onResume()
    Handler(Looper.getMainLooper()).postDelayed({
       editText.setText("Abc")
    }, 500)

}
tpgth1q7

tpgth1q77#

onResume()onStart()可以在popBackStack()上重置EditText上的文本,但问题是当应用程序进入后台时,它们中的任何一个都会被触发,这不是应用程序的预期行为。我们也可以这样做,重置EditText上的文本-

override fun onViewStateRestored(savedInstanceState: Bundle?) {
   super.onViewStateRestored(savedInstanceState)
   binding.coolEt.setText("xyz")
}
vc9ivgsu

vc9ivgsu8#

你需要让你的代码在UI Thread上运行,并且它应该可以工作,如果你这样做,你甚至不必使用onResume():

Handler(Looper.getMainLooper()).post {
    editText.setText("text")
}

相关问题