![](/img/trans.png)
[英]Android Material TextInputLayout and TextInputEditText
[英]Android not saving state of TextInputEditText
所以我之前問了一個題為“ 使用導航抽屜從片段 A 切換到片段 B,使片段 A 停止工作”的問題,經過大量研究后,我意識到我什至沒有嘗試保存片段的狀態。 經過一整天的故障排除后,我仍然沒有它,所以回來尋求如何解決這個問題的智慧。 就像我在上一個問題中所說的那樣,我是新手,所以不太了解這一切,所以希望不要讓自己太尷尬。
對於上下文,該應用程序是一個語言翻譯應用程序,您輸入文本,點擊按鈕translate ,然后閱讀結果。 當切換片段時,即Home
到Gallery
然后回到Home
,翻譯和文本輸入消失了。
簡單地說,為什么我的文本在切換時沒有被保存?
我擁有的 onCreate 代碼是:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null)
{
sourceEdit.setText(savedInstanceState.getString("textKey"));
}
onSaveInstanceState:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("textKey", sourceEdit.getText().toString());
}
完整的代碼只是為了:
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"));
}
如果這發生在片段中。 尚未創建 UI。 所以你必須保存在一些變量中。
String myEditString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null)
{
myEditString = savedInstanceState.getString("textKey");
}
而不是在onViewCrated()
進行插入,並且必須在片段中進行插入。 或者只使用 jetpack 中的 ViewModel 類
好的,我看到你從活動中編碼。 嘗試訪問它時,您沒有初始化您的 sourceEdit。 如果您使用綁定,則不必將所有 UI 保存在變量中。 它會將它們全部保留,只需使用binding.yourIdInXml
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.