Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 566
  • Last Modified:

What's wrong on this little fragment of Android code

Hi.

I have a little Android app which has a tab control on top to show a relative layout with a background image.

I would like that when user makes a click on the background image, this image change, so I added this code inside the onCreate event:

		findViewById(R.drawable.background1).setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				nextImageEspera();
			}
		});

Open in new window


With this code, when starting app, it crashes. If I comment this code then all works fine (except the image don't change).

I know the problem is not on nextImageEspera() function because app crashes even if I comment this call.

What is wrong?
0
gplana
Asked:
gplana
  • 8
  • 7
  • 3
  • +1
1 Solution
 
käµfm³d 👽Commented:
Have you tried debugging it? What is the error message?
0
 
krakatoaCommented:
Doesn't this look odd to you :

findViewById(R.drawable.background1)

shouldn't it be more like :

findViewById(R.id.background1);

?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
gplanaAuthor Commented:
Thank you all for your comments.

This is the logcat just after the app crashed. I have commented the line with the call, so my code is this:

		findViewById(R.drawable.background1).setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				nextImageEspera();
			}
		});

Open in new window


Any help?

Thanks
logErrors.txt
0
 
CEHJCommented:
logErrors.txt 0 bytes
The log file is empty
0
 
gplanaAuthor Commented:
Sorry, it was my fault. Now here are the logs.
logErrors.txt
0
 
CEHJCommented:
Please post line 114 of FragmentTabs.java
0
 
gplanaAuthor Commented:
Is the first line inside function  nextImageEspera:

113      public void nextImageEspera(){
114            RelativeLayout v =(RelativeLayout)findViewById(R.id.root);
115            v.setBackgroundResource(R.drawable.detall_espera);
      }
0
 
krakatoaCommented:
Could be you are casting to the wrong type somewhere.
0
 
CEHJCommented:
That's your problem: it's not a RelativeLayout, so cannot be cast to it
0
 
gplanaAuthor Commented:
I think it is:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@drawable/background1"
    android:id="@+id/root"
    tools:context=".MainActivity" >

Open in new window

0
 
CEHJCommented:
Nope. You can find out what it is by

System.out.println(findViewById(R.id.root).getClass());

Open in new window

0
 
gplanaAuthor Commented:
Thank you. You were right. It seems to be a LinearLayout.

After changing this the app doesn't crash anymore but the image still don't change. Why?

This is the code on the function now:

	public void nextImageEspera(){
		System.out.println(findViewById(R.id.root).getClass());
		LinearLayout v =(LinearLayout)findViewById(R.id.root);
		v.setBackgroundResource(R.drawable.detall_espera);
		v.invalidate();
	}

Open in new window


And I attach logs
log4.txt
0
 
CEHJCommented:
Well now i'm at a disadvantage - i don't do Android ;) Try calling repaint?
0
 
gplanaAuthor Commented:
I have read that invalidate() is the method to do a repaint. Is that not true?
0
 
krakatoaCommented:
Ha - I don't do Android either, but from sniffing around, one reason could be that your thread is asleep, similar to the effect of running a long-winded command - or calling sleep() - on the Event Dispatch Thread, EDT, in mainstream Java. Maybe check you haven't called sleep() like that.
0
 
CEHJCommented:
I would guess the main purpose of that is to layout the gui again. I know that sometimes with Swing at least, revalidate is insufficient to cause the display to update properly and repaint has to be called as well. So just guessing here
0
 
gplanaAuthor Commented:
You were right. After some investigation, I have found another way to refresh. This is my current code:

      public void nextImageEspera(){
            System.out.println(findViewById(R.id.root).getClass());
            LinearLayout v =(LinearLayout)findViewById(R.id.root);
            v.setBackgroundResource(R.drawable.detall_espera);
            v.invalidate();
           v.removeAllViews();
             v.refreshDrawableState();
     }

Thanks
0
 
CEHJCommented:
Good :)
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 8
  • 7
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now