मेरा एप्लिकेशन एपीआई 24 और इसके बाद के संस्करण पर काम करता है लेकिन एपीआई 19 पर क्रैश हो जाता है। समस्या ऑनक्रेट विधि में सेटकंटेंट व्यू लाइन पर प्रतीत होती है।
मैंने एंड्रॉइड एक्सएमएल फ़ाइल में सभी एपीआई 21+ सुविधाओं को बदलने की कोशिश की लेकिन इससे मदद नहीं मिली। मल्टीडेक्स डालने की भी कोशिश की और यह काम नहीं किया।
मैंने यहां setContentView विधि जोड़ी है:
package com.idan.idanzimbler.epiclogin.view;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.idan.idanzimbler.epiclogin.R;
import com.idan.idanzimbler.epiclogin.controller.FillSeriesListFromFireBaseBySearchTask;
import com.idan.idanzimbler.epiclogin.controller.FillSeriesListFromFireBaseBySuggestionsTask;
import com.idan.idanzimbler.epiclogin.controller.FillSeriesListFromFireBaseTask;
import com.idan.idanzimbler.epiclogin.controller.TvSeriesFavoriteList;
import com.idan.idanzimbler.epiclogin.controller.TvSeriesHomeList;
import com.idan.idanzimbler.epiclogin.controller.UsersBookmarks;
import com.idan.idanzimbler.epiclogin.modle.TvSeries;
import com.google.firebase.auth.FirebaseAuth;
import com.squareup.picasso.Picasso;
import java.util.Locale;
public class HomeActivity extends AppCompatActivity implements AbsListView.OnScrollListener {
public static final String INTENT_FLAG = "flag";
public static final int FIRST_ENTER = 1;
//public static final int REBUILD = 2;
public static final int RECOMMENDATION_ENTER = 2;
ExpandableListView list;
EditText searchEt;
ProgressBar progressBar;
HomeActivity context;
ImageView questionmarkHomeBtn;
boolean isInSearchMode;
boolean isInRecommendationMode;
TextView homeToolbarTitleTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
loadLocale();
Toolbar toolbar = findViewById(R.id.homeToolbar);
toolbar.setTitle("");
homeToolbarTitleTV = findViewById(R.id.home_titleTV);
setSupportActionBar(toolbar);
context = this;
isInSearchMode = false;
isInRecommendationMode = false;
progressBar = findViewById(R.id.home_progressbar);
questionmarkHomeBtn = findViewById(R.id.home_questionmark_btn);
list = findViewById(R.id.home_series_list);
searchEt = findViewById(R.id.home_search_et);
progressBar.setVisibility(View.VISIBLE);
TvSeriesHomeList.getInstance().clear();
TvSeriesFavoriteList.getInstance().clear();
TvSeriesFavoriteList.getInstance().initializeSeriesList();
UsersBookmarks.getInstance().initializeBookmarks();
Bundle b = getIntent().getExtras();
int flag = 1;
if (b != null) flag = b.getInt(INTENT_FLAG);
if (flag == FIRST_ENTER) {
new FillSeriesListFromFireBaseTask(this, list).execute();
} else if (flag == RECOMMENDATION_ENTER) {
progressBar.setVisibility(View.VISIBLE);
isInRecommendationMode = true;
homeToolbarTitleTV.setText(getString(R.string.recommendation));
new FillSeriesListFromFireBaseBySuggestionsTask(context, list).execute();
}
list.setOnScrollListener(this);
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
TvSeriesFavoriteList favorites = TvSeriesFavoriteList.getInstance();
TvSeries series = TvSeriesHomeList.getInstance().getSeries().get(position);
if (favorites.contains(series.getId())) {
favorites.remove(series.getId());
ImageView star = view.findViewById(R.id.series_list_fav_iv);
Picasso.get().load(R.drawable.emptystar).fit().into(star);
Toast.makeText(getApplicationContext(), "Removed from favorites", Toast.LENGTH_SHORT).show();
} else if (favorites.canAdd(series)) {
favorites.add(series);
ImageView star = view.findViewById(R.id.series_list_fav_iv);
Picasso.get().load(R.drawable.filledstar).fit().into(star);
Toast.makeText(getApplicationContext(), "Added to favorites", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Maximum of 5 series can be added to favorites", Toast.LENGTH_SHORT).show();
}
return true;
}
});
searchEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String searchString = s.toString().trim();
if (searchString.isEmpty()) {
isInSearchMode = false;
TvSeriesHomeList.getInstance().clear();
new FillSeriesListFromFireBaseTask(context, list).execute();
} else {
isInSearchMode = true;
new FillSeriesListFromFireBaseBySearchTask(context, list, searchString).execute();
}
}
});
questionmarkHomeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(HomeActivity.this);
builder.setCancelable(true);
builder.setTitle(getString(R.string.how_to_use));
builder.setMessage(getString(R.string.home_fav_bookmark_explain));
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
builder.show();
}
});
}
@Override
protected void onResume() {
super.onResume();
loadLocale();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (!isInSearchMode && !isInRecommendationMode) {
switch (view.getId()) {
case R.id.home_series_list:
final int lastItem = firstVisibleItem + visibleItemCount;
if (lastItem == totalItemCount) {
if (TvSeriesHomeList.getInstance().getPreLast() != lastItem) {
TvSeriesHomeList.getInstance().incrementPage();
new FillSeriesListFromFireBaseTask(this, list).execute();
TvSeriesHomeList.getInstance().setPreLast(lastItem);
}
}
}
}
}
public ProgressBar getProgressBar() {
return progressBar;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.profilemenu:
startActivity(new Intent(this, ProfileActivity.class));
break;
case R.id.favoritesmenu:
startActivity(new Intent(this, FavoritesActivity.class));
break;
case R.id.aboutmenu:
startActivity(new Intent(this, AboutActivity.class));
break;
case R.id.signoutmenu:
FirebaseAuth.getInstance().signOut();
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
break;
case R.id.recommendationmenu:
TvSeriesHomeList.getInstance().clear();
progressBar.setVisibility(View.VISIBLE);
isInRecommendationMode = true;
new FillSeriesListFromFireBaseBySuggestionsTask(context, list).execute();
homeToolbarTitleTV.setText(getString(R.string.recommendation));
break;
case R.id.homemenu:
if (isInRecommendationMode) {
isInRecommendationMode = false;
TvSeriesHomeList.getInstance().clear();
new FillSeriesListFromFireBaseTask(this, list).execute();
}
homeToolbarTitleTV.setText(getString(R.string.home));
break;
case R.id.rateusmenu:
try{
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=com.idan.idanzimbler.epiclogin")));
}catch (ActivityNotFoundException e){
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=com.idan.idanzimbler.epiclogin")));
}
}
return true;
}
@Override
public void onBackPressed() {
if (!searchEt.getText().toString().isEmpty()) {
searchEt.setText("");
} else if (isInRecommendationMode) {
isInRecommendationMode = false;
TvSeriesHomeList.getInstance().clear();
new FillSeriesListFromFireBaseTask(this, list).execute();
}else {
super.onBackPressed();
}
}
public void setLocale(String lang) {
Locale locale = new Locale(lang,"US");
if(lang.equals("he")){
locale = new Locale(lang,"IL");
}
else if(lang.equals("ar")){
locale = new Locale(lang,"JO");
}
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
SharedPreferences.Editor editor = getSharedPreferences("Settings" ,MODE_PRIVATE).edit();
editor.putString("My_Lang",lang);
editor.apply();
}
public void loadLocale(){
SharedPreferences prefs = getSharedPreferences("Settings",Activity.MODE_PRIVATE);
String language = prefs.getString("My_Lang", "");
setLocale(language);
}
}
एक्सएमएल फ़ाइल:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.HomeActivity">
<EditText
android:id="@+id/home_search_et"
android:layout_width="301dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="14dp"
android:layout_weight="1"
android:ems="10"
android:hint="@string/enter_tv_series_name"
android:inputType="textPersonName"
app:backgroundTint="@color/common_google_signin_btn_text_dark_focused"
app:layout_constraintBottom_toTopOf="@+id/home_series_list"
app:layout_constraintEnd_toStartOf="@+id/home_questionmark_btn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
/>
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
app:layout_constraintBottom_toTopOf="@+id/home_search_et"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<android.support.v7.widget.Toolbar
android:id="@+id/homeToolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:contentInsetStart="0dp"
android:contentInsetLeft="0dp"
android:contentInsetEnd="0dp"
android:contentInsetRight="0dp"
android:elevation="2dp"
android:gravity="end"
app:contentInsetEnd="0dp"
app:contentInsetLeft="0dp"
app:contentInsetRight="0dp"
app:contentInsetStart="0dp"
app:popupTheme="@style/AppTheme.PopupOverlay"
tools:targetApi="lollipop">
<TextView
android:id="@+id/home_titleTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/home"
android:textColor="@color/common_google_signin_btn_text_dark_default"
android:textSize="25sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<ExpandableListView
android:id="@+id/home_series_list"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/home_search_et" />
<ProgressBar
android:id="@+id/home_progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminateDrawable="@drawable/blackprogressbar"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/home_series_list"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/home_questionmark_btn"
android:layout_width="34dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="@+id/home_search_et"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/home_search_et"
app:srcCompat="@drawable/questionmarklogo"
android:contentDescription="TODO" />
</android.support.constraint.ConstraintLayout>
रन:
V/FA: Activity paused, time: 2504321
V/FA: onActivityCreated
D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=11068, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=-8684354233398184439}]
W/dalvikvm: JNI WARNING: NewStringUTF input is not valid Modified UTF-8: illegal start byte 0xf0
string: 'en_Latn_US_�_US'
in Llibcore/icu/ICU;.addLikelySubtags:(Ljava/lang/String;)Ljava/lang/String; (NewStringUTF)
I/dalvikvm: "main" prio=5 tid=1 NATIVE
| group="main" sCount=0 dsCount=0 obj=0xa4d56bd8 self=0xb7e34eb0
| sysTid=3387 nice=0 sched=0/0 cgrp=apps handle=-1216573376
| state=R schedstat=( 1431490769 212065377 2672 ) utm=91 stm=51 core=1
I/dalvikvm: #00 pc 000bd936 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+86)
#01 pc 00098513 /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+1155)
#02 pc 00098806 /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+86)
#03 pc 0004d3ff /system/lib/libdvm.so (ScopedCheck::checkUtfString(char const*, bool)+271)
#04 pc 0004e2ad /system/lib/libdvm.so (ScopedCheck::check(bool, char const*, ...)+1437)
#05 pc 00052927 /system/lib/libdvm.so
#06 pc 000204be /system/lib/libjavacore.so
#07 pc 0002a4ab /system/lib/libdvm.so (dvmPlatformInvoke+79)
at libcore.icu.ICU.addLikelySubtags(Native Method)
I/dalvikvm: at android.text.TextUtils.getLayoutDirectionFromLocale(TextUtils.java:1740)
at android.content.res.Configuration.setLayoutDirection(Configuration.java:1295)
at android.content.res.Configuration.updateFrom(Configuration.java:820)
at android.content.res.Resources.updateConfiguration(Resources.java:1557)
at android.content.res.Resources.updateConfiguration(Resources.java:1511)
at android.support.v7.widget.ResourcesWrapper.updateConfiguration(ResourcesWrapper.java:232)
at android.content.res.Resources.<init>(Resources.java:202)
at android.content.res.Resources.<init>(Resources.java:179)
at android.support.v7.widget.ResourcesWrapper.<init>(ResourcesWrapper.java:48)
at android.support.v7.widget.TintResources.<init>(TintResources.java:35)
at android.support.v7.widget.TintContextWrapper.<init>(TintContextWrapper.java:101)
at android.support.v7.widget.TintContextWrapper.wrap(TintContextWrapper.java:69)
at android.support.v7.widget.AppCompatEditText.<init>(AppCompatEditText.java:69)
at android.support.v7.widget.AppCompatEditText.<init>(AppCompatEditText.java:65)
at android.support.v7.app.AppCompatViewInflater.createEditText(AppCompatViewInflater.java:192)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:114)
at android.support.v7.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1266)
at android.support.v7.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1316)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:684)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at com.idan.idanzimbler.epiclogin.view.HomeActivity.onCreate(HomeActivity.java:58)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
E/dalvikvm: VM aborting
A/libc: Fatal signal 6 (SIGABRT) at 0x00000d3b (code=-6), thread 3387 (mbler.
Application terminated.
1 उत्तर
स्टैकट्रेस वर्तमान संसाधन कॉन्फ़िगरेशन (चाहे आपका लोकेल आरटीएल है या नहीं) पढ़ने में कोई समस्या इंगित करता है।
गतिविधि कोड को देखते हुए, आप फोन लोकेल का उपयोग करने के बजाय अपने एप्लिकेशन द्वारा उपयोग किए गए लोकेल को संशोधित कर रहे हैं जो इस मुद्दे की व्याख्या करेगा। आपकी गतिविधि वास्तव में onCreate
से दो बार गुजरेगी। पहली बार शायद बिना किसी परेशानी के आपके एक्सएमएल व्यू को बढ़ा रहा है, लेकिन एक बार जब आप नया कॉन्फ़िगरेशन (loadLocale()
पर कॉल करके) सेट करते हैं, तो गतिविधि नष्ट हो जाएगी और फिर से बनाई जाएगी, जो दूसरी बार onCreate()
निष्पादित करेगी। अपने नए कॉन्फ़िगरेशन के साथ। यह तब होता है जब आपका एप्लिकेशन क्रैश हो रहा होता है।
मेरी राय में, समस्या setLocale()
विधि में सबसे अधिक संभावना है, कॉन्फ़िगरेशन का परिवर्तन सही ढंग से नहीं किया गया है और नए एपीआई डिफ़ॉल्ट मान का उपयोग करने में सक्षम हैं जबकि पुराने एपीआई बस क्रैश हो जाते हैं।
भले ही मैं ऐप में लोकेल को संशोधित करने की अनुशंसा नहीं करता, यहां Android एप्लिकेशन में इसे संशोधित करने के बारे में अधिक जानकारी दी गई है:
https://proandroiddev.com/change-language-programmatically- at-runtime-on-android-5e6bc15c758
आपके द्वारा समर्थित API के संस्करण के आधार पर उपयोग करने के लिए अलग-अलग तरीके हैं।
कॉन्फ़िगरेशन बदलने के लिए वह जिस विधि का उपयोग कर रहा है, वह इस प्रकार है:
private static Context updateResources(Context context, Locale locale) {
Locale.setDefault(locale);
Resources res = context.getResources();
Configuration config = new Configuration(res.getConfiguration());
if (Build.VERSION.SDK_INT >= 17) {
config.setLocale(locale);
context = context.createConfigurationContext(config);
} else {
config.locale = locale;
res.updateConfiguration(config, res.getDisplayMetrics());
}
return context;
}
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।