title: How to set the background image programmatically?
body: <p>I've got a problem with setting a background programmatically. I cannot do it.</p>
  
  <p>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).</p>
  
  <pre><code>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()){
  
              }
  
          }
      });             
  }
  </code></pre>
  
  <p>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.</p>
  
  <pre><code>&lt;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" &gt;
  
  // other things like a ImageButton, a TextView etc
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <p>Finally, when I click one of the radio buttons is replaced by:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>and the application is closed. I tried use this way:</p>
  
  <pre><code>relativeLayout.setBackgroundResource(R.drawable.mountains);
  </code></pre>
  
  <p>and this way:</p>
  
  <pre><code>relativeLayout.setBackground(getResources().getDrawable(R.drawable.mountains));
  </code></pre>
  
  <p>and this way:</p>
  
  <pre><code>relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.mountains));
  </code></pre>
  
  <p>and none of them work.</p>
  
  <p>How can i fix this issue? What should i correct?</p>
  
  <h1><strong>The solution:</strong></h1>
  
  <ol>
  <li>Move the relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayoutid) and setBackgroundResource() method to the main activity behind setContentView() method.</li>
  <li>Create a static variable and put this varaible in the setBackgroundResource() method as the parameter.</li>
  <li>Change the static variable in theme activity where you've got radio buttons.</li>
  </ol>
  
  <p>MainActivity class:</p>
  
  <pre><code>@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;
  }
  </code></pre>
  
  <p>activity_main.xml for MainActivity class:</p>
  
  <pre><code>&lt;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" &gt;
  
  // other things like a ImageButton, a TextView etc
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <p>ThemeActivity class where I change the main background:</p>
  
  <pre><code>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;
  }
  </code></pre>