Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 568
  • 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
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

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