I've got a problem with setting a background image programmatically. I cannot do it.
This is my theme class. There are radio buttons in the code that should change the main background. So far I've written implementation for two radio buttons (i.e. radioButtonMountains and radioButtonSea) that should load two different images (i.e. mountains.png and sea.png).
public class ThemeActivity extends BasicActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_theme);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle("Motywy");
setAction();
}
private void setAction(){
relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayoutid);
radioGroup=(RadioGroup) findViewById(R.id.radioGroup);
radioButtonMountains=(RadioButton) findViewById(R.id.radioMountains);
radioButtonCity=(RadioButton) findViewById(R.id.radioCity);
radioButtonSea=(RadioButton) findViewById(R.id.radioSea);
radioButtonNature=(RadioButton) findViewById(R.id.radioNature);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(radioButtonMountains.isChecked()){
//relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.mountains));
//relativeLayout.setBackground(getResources().getDrawable(R.drawable.mountains));
relativeLayout.setBackgroundResource(R.drawable.mountains);
}
else if(radioButtonCity.isChecked()){
}
else if(radioButtonSea.isChecked()){
relativeLayout.setBackgroundResource(R.drawable.sea);
}
else if(radioButtonNature.isChecked()){
}
}
});
}
This is my activity_main.xml for my main class (if you want i can paste the code with my main class). I've added 'android:id="@+id/relativeLayoutid"' which is referred to above.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayoutid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/sea"
android:orientation="vertical" >
// other things like a ImageButton, a TextView etc
</RelativeLayout>
Finally, when I click, one of the radio buttons is replaced by:
11-11 21:28:34.172: D/AndroidRuntime(22316): Shutting down VM
11-11 21:28:34.172: W/dalvikvm(22316): threadid=1: thread exiting with uncaught exception (group=0x411162a0)
11-11 21:28:34.202: E/AndroidRuntime(22316): FATAL EXCEPTION: main
11-11 21:28:34.202: E/AndroidRuntime(22316): java.lang.NullPointerException
11-11 21:28:34.202: E/AndroidRuntime(22316): at com.example.runapp.ThemeActivity$1.onCheckedChanged(ThemeActivity.java:43)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.RadioGroup.setCheckedId(RadioGroup.java:174)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.RadioGroup.access$600(RadioGroup.java:54)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:358)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.CompoundButton.setChecked(CompoundButton.java:140)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.CompoundButton.toggle(CompoundButton.java:92)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.RadioButton.toggle(RadioButton.java:76)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.widget.CompoundButton.performClick(CompoundButton.java:104)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.view.View$PerformClick.run(View.java:17082)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.os.Handler.handleCallback(Handler.java:615)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.os.Handler.dispatchMessage(Handler.java:92)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.os.Looper.loop(Looper.java:137)
11-11 21:28:34.202: E/AndroidRuntime(22316): at android.app.ActivityThread.main(ActivityThread.java:4867)
11-11 21:28:34.202: E/AndroidRuntime(22316): at java.lang.reflect.Method.invokeNative(Native Method)
11-11 21:28:34.202: E/AndroidRuntime(22316): at java.lang.reflect.Method.invoke(Method.java:511)
11-11 21:28:34.202: E/AndroidRuntime(22316): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
11-11 21:28:34.202: E/AndroidRuntime(22316): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
11-11 21:28:34.202: E/AndroidRuntime(22316): at dalvik.system.NativeStart.main(Native Method)
and the application closed. I tried use this way:
relativeLayout.setBackgroundResource(R.drawable.mountains);
and this way:
relativeLayout.setBackground(getResources().getDrawable(R.drawable.mountains));
and this way:
relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.mountains));
and none of them work.
How can i fix this issue? What should i correct?
The solution:
- Move the relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayoutid) and setBackgroundResource() method to the main activity behind setContentView() method.
- Create a static variable and put this varaible in the setBackgroundResource() method as the parameter.
- Change the static variable in theme activity where you've got radio buttons.
MainActivity class:
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class MainActivity extends BasicActivity implements OnClickListener {
public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//other things
setContentView(R.layout.activity_main);
relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayoutid);
if(image==0) relativeLayout.setBackgroundResource(R.drawable.mountains);
else relativeLayout.setBackgroundResource(image);
//other things
}
//other things
public RelativeLayout relativeLayout;
public static int image;
}
activity_main.xml for MainActivity class:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayoutid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/sea"
android:orientation="vertical" >
// other things like a ImageButton, a TextView etc
</RelativeLayout>
ThemeActivity class where I change the main background:
public class ThemeActivity extends BasicActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_theme);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle("Theme");
setAction();
}
private void setAction(){
radioGroup=(RadioGroup) findViewById(R.id.radioGroup);
radioButtonMountains=(RadioButton) findViewById(R.id.radioMountains);
radioButtonCity=(RadioButton) findViewById(R.id.radioCity);
radioButtonSea=(RadioButton) findViewById(R.id.radioSea);
radioButtonNature=(RadioButton) findViewById(R.id.radioNature);
setRadioChoose();
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(radioButtonMountains.isChecked()){
MainActivity.image=R.drawable.mountains;
}
else if(radioButtonCity.isChecked()){
MainActivity.image=R.drawable.city;
}
else if(radioButtonSea.isChecked()){
MainActivity.image=R.drawable.sea;
}
else if(radioButtonNature.isChecked()){
MainActivity.image=R.drawable.nature;
}
saveRadioChoose(checkedId);
}
});
}
private void setRadioChoose(){
radioChoose=PreferenceManager.getDefaultSharedPreferences(getBaseContext());
radioChooseEdit=radioChoose.edit();
int radio=radioChoose.getInt("RADIO", 0);
if(radio==radioButtonMountains.getId()) radioButtonMountains.setChecked(true);
else if(radio==radioButtonCity.getId()) radioButtonCity.setChecked(true);
else if(radio==radioButtonSea.getId()) radioButtonSea.setChecked(true);
else if(radio==radioButtonNature.getId()) radioButtonNature.setChecked(true);
else if(radio==0) radioButtonMountains.setChecked(true);
}
private void saveRadioChoose(int checkedId){
radioChooseEdit.putInt("RADIO", checkedId);
radioChooseEdit.commit();
}
private RadioGroup radioGroup;
private RadioButton radioButtonMountains;
private RadioButton radioButtonCity;
private RadioButton radioButtonSea;
private RadioButton radioButtonNature;
private SharedPreferences radioChoose;
private SharedPreferences.Editor radioChooseEdit;
}