简体   繁体   English

Android 不保存 TextInputEditText 的状态

[英]Android not saving state of TextInputEditText

So I previously asked a question titled " Switching from Fragment A to Fragment B with navigation drawer, stops Fragment A from working " After doing a lot of research I realised I wasn't even attempting to save the state of the fragment.所以我之前问了一个题为“ 使用导航抽屉从片段 A 切换到片段 B,使片段 A 停止工作”的问题,经过大量研究后,我意识到我什至没有尝试保存片段的状态。 After troubleshooting all day I still don't have it so came back for wisdom on how to solve this.经过一整天的故障排除后,我仍然没有它,所以回来寻求如何解决这个问题的智慧。 Like I said in my previous question, I'm new so don't quite get it all so hopefully not embarrassing myself too much.就像我在上一个问题中所说的那样,我是新手,所以不太了解这一切,所以希望不要让自己太尴尬。

For context, the app is a language translation app, you enter the text, hit the button translate , and read the result.对于上下文,该应用程序是一个语言翻译应用程序,您输入文本,点击按钮translate ,然后阅读结果。 When switching fragments, ie Home to Gallery then back to Home , the translation and text input is gone.当切换片段时,即HomeGallery然后回到Home ,翻译和文本输入消失了。

Simply, why is my text not being saved when switching?简单地说,为什么我的文本在切换时没有被保存?

The onCreate code I have is:我拥有的 onCreate 代码是:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState != null)
        {
            sourceEdit.setText(savedInstanceState.getString("textKey"));

        }

The onSaveInstanceState: onSaveInstanceState:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("textKey", sourceEdit.getText().toString());
    }

The full code just incase:完整的代码只是为了:

public class MainDrawerActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    private ActivityMainDrawerBinding binding;
    private Spinner fromSpinner, toSpinner;
    private TextInputEditText sourceEdit;
    private ImageView micIV;
    private MaterialButton translateBtn;
    private TextView translatedTV;
    String[] fromLanguages = {"From","English","Korean"};
    String[] toLanguages = {"From","English","Korean"};


    private static final int REQUEST_PERMISSION_CODE = 1;
    int languageCode, fromLanguageCode, toLanguageCode = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState != null)
        {
            sourceEdit.setText(savedInstanceState.getString("textKey"));

        }

        binding = ActivityMainDrawerBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(binding.appBarMainDrawer.toolbar);

        DrawerLayout drawer = binding.drawerLayout;
        NavigationView navigationView = binding.navView;
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
                .setOpenableLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main_drawer);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);

        //start of language code

        fromSpinner = findViewById(R.id.idFromSpinner);
        toSpinner = findViewById(R.id.idToSpinner);
        sourceEdit = findViewById(R.id.idEditSource);
        micIV = findViewById(R.id.idIVMic);
        translateBtn = findViewById(R.id.idButtonTranslate);
        translatedTV = findViewById(R.id.idTVTranslatedTV);

        fromSpinner.setOnItemSelectedListener(new OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                fromLanguageCode = getLanguageCode(fromLanguages[position]);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        ArrayAdapter fromAdapter = new ArrayAdapter(this, R.layout.spinner_item, fromLanguages);
        fromAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        fromSpinner.setAdapter(fromAdapter);

        toSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                toLanguageCode = getLanguageCode(toLanguages[position]);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        ArrayAdapter toAdapter = new ArrayAdapter(this,R.layout.spinner_item, toLanguages);
        toAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        toSpinner.setAdapter(toAdapter);

        translateBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                translatedTV.setText("");
                if(sourceEdit.getText().toString().isEmpty()){
                    makeText(MainDrawerActivity.this, "Please enter text", Toast.LENGTH_SHORT).show();
                }
                else if(fromLanguageCode==0){
                    makeText(MainDrawerActivity.this, "Please select source language", Toast.LENGTH_SHORT).show();
                }
                else if(toLanguageCode==0){
                    makeText(MainDrawerActivity.this, "Please select language to translate too", Toast.LENGTH_SHORT).show();
                } else {
                    translateText(fromLanguageCode, toLanguageCode, sourceEdit.getText().toString());

                }
                InputMethodManager inputManager = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);

                inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS);
            }
        });

        micIV.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
                i.putExtra(RecognizerIntent.EXTRA_PROMPT,"Speak to translate text");
                try {
                    startActivityForResult(i, REQUEST_PERMISSION_CODE);
                } catch (Exception e){
                    e.printStackTrace();
                    Toast.makeText(MainDrawerActivity.this, " "+e.getMessage(), Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("textKey", sourceEdit.getText().toString());
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==REQUEST_PERMISSION_CODE){
            if(resultCode==RESULT_OK && data!=null){
                ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                sourceEdit.setText(result.get(0));
            }
        }
    }
    private void translateText(int fromLanguageCode, int toLanguageCode, String source) {
        translatedTV.setText("Downloading Model...");
        FirebaseTranslatorOptions options = new FirebaseTranslatorOptions.Builder()
                .setSourceLanguage(fromLanguageCode)
                .setTargetLanguage(toLanguageCode)
                .build();
        FirebaseTranslator translator = FirebaseNaturalLanguage.getInstance().getTranslator(options);

        FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder().build();

        translator.downloadModelIfNeeded(conditions).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void unused) {
                translatedTV.setText("Translating...");
                translator.translate(source).addOnSuccessListener(new OnSuccessListener<String>() {
                    @Override
                    public void onSuccess(String s) {
                        translatedTV.setText(s);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MainDrawerActivity.this, "Failed to translate: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainDrawerActivity.this, "Failed to download model... " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    //Method that gets the languages from Firebase
    public int getLanguageCode(String language) {
        int languageCode = 0;
        switch (language) {
            case "English":
                languageCode = FirebaseTranslateLanguage.EN;
                break;
            case "Korean":
                languageCode = FirebaseTranslateLanguage.KO;
                break;
            default:
                languageCode = 0;
        }
        return languageCode;
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_drawer, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main_drawer);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState != null)
        {
            sourceEdit.setText(savedInstanceState.getString("textKey"));

        }

If this happening in fragment.如果这发生在片段中。 UI isn't created yet.尚未创建 UI。 So you have to save in some variable.所以你必须保存在一些变量中。

String myEditString;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState != null)
        {
            myEditString = savedInstanceState.getString("textKey");

        }

And than in onViewCrated() do your insertion and you have to do that in you fragments.而不是在onViewCrated()进行插入,并且必须在片段中进行插入。 Or just use ViewModel class from jetpack或者只使用 jetpack 中的 ViewModel 类
ok i see you code from activity.好的,我看到你从活动中编码。 you isnt initialized your sourceEdit when trying to access it.尝试访问它时,您没有初始化您的 sourceEdit。 And if uou using bindings you dont have to save all your UI in variavles.如果您使用绑定,则不必将所有 UI 保存在变量中。 It will hold them all just use binding.yourIdInXml它会将它们全部保留,只需使用binding.yourIdInXml

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM