将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”
Posted
技术标签:
【中文标题】将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”【英文标题】:Adding Yandex Translator to Fragment leads to "App Crashes" 【发布时间】:2018-05-02 13:12:07 【问题描述】:我在我的应用程序中使用 Yandex Translator,如果我使用 Activity 效果很好,但是当我将它添加到 fragment 时,应用程序在启动前崩溃。 代码中也没有显示错误,就像一切都很好,可能是什么问题: 我在这里寻找了类似的答案,但我一无所获,在使用片段之前没有人遇到过这个问题。
这是片段的代码:
public class FavoritesFragment extends Fragment implements TextToSpeech.OnInitListener
private TextView header, toText, toLabel, fromLabel;
private ImageView micFrom, volFrom, volTo, reverse;
private EditText fromText;
private CircleButton convertBTN;
private CircleButton convertLayout;
private final int REQ_CODE_SPEECH_INPUT = 100;
private final int SR_CODE = 123;
private String ENGLISH_CONSTANT = "";
private String TURKISH_CONSTANT = "";
private String ENGLISH_CONVERT = "";
private String TURKISH_CONVERT = "";
private String TURKISH_CODE = "";
private String currentFrom = "";
TextToSpeech ttsEnglish, ttsTURKISH;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View v = inflater.inflate(R.layout.fragment_favorites, container, false);
setUpInitialConstants();
setUpInteraction();
setUpSpeakingListeners();
setUpListeners();
return v;
private void setUpInitialConstants()
ENGLISH_CONSTANT = ("ENGLISH");
TURKISH_CONSTANT = ("TURKISH");
ENGLISH_CONVERT = ("en") + "-" + ("tr");//"en-zh";
TURKISH_CONVERT = ("tr") + "-" + ("en");
//"zh-en";
TURKISH_CODE = ("tr");
currentFrom = ENGLISH_CONSTANT;
private void setUpSpeakingListeners()
ttsEnglish = new TextToSpeech(getContext().getApplicationContext(), new TextToSpeech.OnInitListener()
@Override
public void onInit(int status)
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS)
int result = ttsEnglish.setLanguage(Locale.ENGLISH);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED)
Log.e("error", "This Language is not supported");
else
//ConvertTextToSpeech();
else
Log.e("error", "Initilization Failed!");
);
ttsTURKISH = new TextToSpeech(getContext().getApplicationContext(), new TextToSpeech.OnInitListener()
@Override
public void onInit(int status)
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS)
Locale locale = new Locale("tr-TR");
int result = ttsTURKISH.setLanguage(locale);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED)
Log.e("error", "not supported");
else
//ConvertTextToSpeech();
else
Log.e("error", "Initilization Failed!");
);
@SuppressLint("ClickableViewAccessibility")
private void setUpListeners()
convertLayout.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
callReverse();
);
micFrom.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
askSpeechInput(currentFrom);
);
volFrom.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
ConvertTextToSpeech(currentFrom, fromText.getText().toString());
);
volTo.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
String currentFromR = reverseCurrentFrom(currentFrom);
ConvertTextToSpeech(currentFromR, toText.getText().toString());
);
convertBTN.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
if (currentFrom.equals(ENGLISH_CONSTANT))
translateText(fromText.getText().toString(), ENGLISH_CONVERT);
else
translateText(fromText.getText().toString(), TURKISH_CONVERT);
);
toText.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
if (copyToClipboard(getContext().getApplicationContext(), toText.getText().toString()))
if (currentFrom.equals(ENGLISH_CONSTANT))
Toast.makeText(getContext().getApplicationContext(), ("copied"), Toast.LENGTH_SHORT).show();
else
Toast.makeText(getContext().getApplicationContext(), (" copied successfully "), Toast.LENGTH_SHORT).show();
);
fromText.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
fromText.setFocusableInTouchMode(true);
return false;
);
private String reverseCurrentFrom(String currentFrom)
if (currentFrom.equals(ENGLISH_CONSTANT))
return TURKISH_CONSTANT;
else return ENGLISH_CONSTANT;
private void callReverse()
if (currentFrom.equals(ENGLISH_CONSTANT))
currentFrom = TURKISH_CONSTANT;
//header.setText(getString(R.string.convertHeaderR));
fromLabel.setText(("TURKISH"));
fromText.setHint(("push to talk"));
toLabel.setText(("English"));
toText.setText(("Click translate Button to get English text"));
else
currentFrom = ENGLISH_CONSTANT;
//header.setText(getString(R.string.convertHeader));
fromLabel.setText(("English"));
fromText.setHint(("Speak or type text here"));
toLabel.setText(("TURKISH"));
toText.setText(("click to translate"));
fromText.setText("");
fromText.setFocusable(false);
private void setUpInteraction()
this.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
toText = getView().findViewById(R.id.toText);
toLabel = getView().findViewById(R.id.toLabel);
fromLabel = getView().findViewById(R.id.fromLabel);
micFrom = getView().findViewById(R.id.micFrom);
volFrom = getView().findViewById(R.id.volFrom);
volTo = getView().findViewById(R.id.toVol);
convertBTN = getView().findViewById(R.id.convertBTN);
fromText = getView().findViewById(R.id.fromText);
convertLayout = getView().findViewById(R.id.swapLanguage);
fromText.setFocusable(false);
currentFrom = TURKISH_CONSTANT;
callReverse();
private void ConvertTextToSpeech(String lang_type, String text)
if (text == null || "".equals(text))
if (lang_type.equals(ENGLISH_CONSTANT))
text = ("Content not available");
else
text = ("something wrong !");
if (lang_type.equals(ENGLISH_CONSTANT))
ttsEnglish.speak(text, TextToSpeech.QUEUE_FLUSH, null);
else
ttsTURKISH.speak(text, TextToSpeech.QUEUE_FLUSH, null);
private void askSpeechInput(String lang_type)
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
if (lang_type.equals(ENGLISH_CONSTANT))
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
"Hi speak something");
startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
else
//Specify language
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_RESULTS, TURKISH_CODE);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, ("speak please"));
startActivityForResult(intent, SR_CODE);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
case REQ_CODE_SPEECH_INPUT:
if (resultCode == RESULT_OK && null != data)
ArrayList<String> result = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
fromText.setText(result.get(0));
break;
case SR_CODE:
if (resultCode == RESULT_OK)
if (data != null)
ArrayList<String> nBestList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String bestResult = nBestList.get(0);
fromText.setText(bestResult);
break;
if (currentFrom.equals(ENGLISH_CONSTANT))
translateText(fromText.getText().toString(), ENGLISH_CONVERT);
else
translateText(fromText.getText().toString(), TURKISH_CONVERT);
@Override
public void onInit(int status)
if (status == TextToSpeech.SUCCESS)
else
Log.e("TTS", "Initialization failed");
String text_to_return = "";
private String translateText(final String text, final String lang)
class getQData extends AsyncTask<String, String, String>
ProgressDialog loading;
String ROOT_URL = "https://translate.yandex.net";
Retrofit adapter = new Retrofit.Builder()
.baseUrl(ROOT_URL)
.addConverterFactory(JacksonConverterFactory.create())
.build();
APICalls api = adapter.create(APICalls.class);
@Override
protected void onPreExecute()
super.onPreExecute();
showPD();
@Override
protected void onPostExecute(String s)
super.onPostExecute(s);
@Override
protected String doInBackground(String... params)
text_to_return = "";
String key = translator_Constants.MY_KEY;
Call<TranslateResponse> call = api.translate(key, text, lang);
call.enqueue(new Callback<TranslateResponse>()
@Override
public void onResponse(retrofit.Response<TranslateResponse> response, Retrofit retrofit)
//loading.dismiss();
hidePD();
Log.d("succ", "onResponse:code" + String.valueOf(response.code()));
Log.d("error mesg", String.valueOf(response.message()));
switch (response.code())
case 200:
TranslateResponse tr = response.body();
text_to_return = tr.getText().get(0);
toText.setText(text_to_return);
String currentFromR = reverseCurrentFrom(currentFrom);
ConvertTextToSpeech(currentFromR, toText.getText().toString());
break;
default:
if (currentFrom.equals(ENGLISH_CONSTANT))
Toast.makeText(getContext().getApplicationContext(), ("Please Try Again"), Toast.LENGTH_SHORT).show();
else
Toast.makeText(getContext().getApplicationContext(), ("again"), Toast.LENGTH_SHORT).show();
break;
@Override
public void onFailure(Throwable t)
pd.dismiss();
Log.d("retro error", t.getMessage());
if (currentFrom.equals(ENGLISH_CONSTANT))
Toast.makeText(getContext().getApplicationContext(), ("Failed to Convert!Check Internet Connection"), Toast.LENGTH_SHORT).show();
else
Toast.makeText(getContext().getApplicationContext(), ("no connexion"), Toast.LENGTH_SHORT).show();
);
return text_to_return;
getQData ru = new getQData();
try
ru.execute().get();
catch (InterruptedException e)
e.printStackTrace();
catch (ExecutionException e)
e.printStackTrace();
return text_to_return;
ProgressDialog pd;
private void showPD()
pd = new ProgressDialog(getActivity());
if (currentFrom.equals(ENGLISH_CONSTANT))
pd.setMessage(("Patience, We are translating…"));
else
pd.setMessage(("translating ..."));
pd.show();
private void hidePD()
pd.dismiss();
public boolean copyToClipboard(Context context, String text)
try
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB)
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
.getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(text);
else
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context
.getSystemService(CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData
.newPlainText("copy", text);
clipboard.setPrimaryClip(clip);
return true;
catch (Exception e)
return false;
【问题讨论】:
使用 LogCat 检查与您的崩溃相关的 Java 堆栈跟踪:***.com/questions/23353173/… 这里是 logcat,我不明白究竟是什么让应用程序崩溃 【参考方案1】:请从onViewCreated()
而非onCreateView()
致电setupInteraction()
。您正在尝试使用getView()
,在onCreateView()
返回之前将无法使用。
【讨论】:
你能告诉我在哪里编辑,因为我不擅长编程;以上是关于将 Yandex 翻译器添加到 Fragment 会导致“应用程序崩溃”的主要内容,如果未能解决你的问题,请参考以下文章
Yandex Translator Api 使用到 vb.net