i am working on voice recording application and its has many functionality, i want to add an imagebutton on the main page to change the language of the application.
when i try to run the application by using imagebutton and setOnClickListener() function to change the language i got this error :
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
i have no idea which view i have to pass to setOnClickListener() function
this is MainActivity class:
public class MainActivity extends AppCompatActivity {
private @NonNull ActivityMainBinding bottonvi;
private homeFragment homeFragment=new homeFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bottonvi=ActivityMainBinding.inflate(getLayoutInflater());
setContentView(bottonvi.getRoot());
reqFragment(new homeFragment());
bottonvi.bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.nav_home:
reqFragment(new homeFragment());
return true;
case R.id.nav_addrec:
if (homeFragment.getIsRecording()) {
homeFragment.stopRecording();
homeFragment.recordBtn.setImageDrawable(getResources().getDrawable(R.drawable.record_logo, null));
homeFragment.setIsRecording(false);
}
reqFragment(new addrecFragment());
return true;
case R.id.nav_history:
if (homeFragment.getIsRecording()) {
homeFragment.stopRecording();
homeFragment.recordBtn.setImageDrawable(getResources().getDrawable(R.drawable.record_logo, null));
homeFragment.setIsRecording(false);
}
reqFragment(new historyFragment());
return true;
case R.id.nav_about:
if (homeFragment.getIsRecording()) {
homeFragment.stopRecording();
homeFragment.recordBtn.setImageDrawable(getResources().getDrawable(R.drawable.record_logo, null));
homeFragment.setIsRecording(false);
}
reqFragment(new about_fragment());
return true;
}
return false;
}
});
ImageButton img = findViewById(R.id.EN);
img.setOnClickListener(view -> {
LocaleHelper.setLocale(this,"en");
});
}
private void reqFragment(Fragment fragment){
FragmentManager fragmentManager =getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frameLayout,fragment);
fragmentTransaction.commit();
}}
LocaleHelper class :
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static void onCreate(Context context) {
String lang;
if(getLanguage(context).isEmpty()){
lang = getPersistedData(context, Locale.getDefault().getLanguage());
}else {
lang = getLanguage(context);
}
setLocale(context, lang);
}
public static void onCreate(Context context, String defaultLanguage) {
String lang = getPersistedData(context, defaultLanguage);
setLocale(context, lang);
}
public static String getLanguage(Context context) {
return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static void setLocale(Context context, String language) {
persist(context, language);
updateResources(context, language);
}
private static String getPersistedData(Context context, String defaultLanguage) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}
private static void persist(Context context, String language) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SELECTED_LANGUAGE, language);
editor.apply();
}
private static void updateResources(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}}
the application have many layouts , also i have created string.xml for the other language