Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

What's wrong on this little fragment of Android code

Posted on 2014-02-07
19
551 Views
Last Modified: 2014-02-10
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
Comment
Question by:gplana
  • 8
  • 7
  • 3
  • +1
19 Comments
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 39842979
Have you tried debugging it? What is the error message?
0
 
LVL 16

Expert Comment

by:krakatoa
ID: 39843093
Doesn't this look odd to you :

findViewById(R.drawable.background1)

shouldn't it be more like :

findViewById(R.id.background1);

?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 39843142
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
LVL 15

Author Comment

by:gplana
ID: 39845453
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
 
LVL 86

Expert Comment

by:CEHJ
ID: 39845562
logErrors.txt 0 bytes
The log file is empty
0
 
LVL 15

Author Comment

by:gplana
ID: 39845613
Sorry, it was my fault. Now here are the logs.
logErrors.txt
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 39845887
Please post line 114 of FragmentTabs.java
0
 
LVL 15

Author Comment

by:gplana
ID: 39845907
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
 
LVL 16

Expert Comment

by:krakatoa
ID: 39845918
Could be you are casting to the wrong type somewhere.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 39845920
That's your problem: it's not a RelativeLayout, so cannot be cast to it
0
 
LVL 15

Author Comment

by:gplana
ID: 39845936
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
 
LVL 86

Expert Comment

by:CEHJ
ID: 39845942
Nope. You can find out what it is by

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

Open in new window

0
 
LVL 15

Author Comment

by:gplana
ID: 39845986
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
 
LVL 86

Expert Comment

by:CEHJ
ID: 39846018
Well now i'm at a disadvantage - i don't do Android ;) Try calling repaint?
0
 
LVL 15

Author Comment

by:gplana
ID: 39846525
I have read that invalidate() is the method to do a repaint. Is that not true?
0
 
LVL 16

Expert Comment

by:krakatoa
ID: 39846783
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
 
LVL 86

Accepted Solution

by:
CEHJ earned 500 total points
ID: 39846790
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
 
LVL 15

Author Comment

by:gplana
ID: 39846887
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
 
LVL 86

Expert Comment

by:CEHJ
ID: 39846929
Good :)
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
wondershare 17 79
Adding multiple JVM environments to RedHat 6 7 46
Enterprise WhatsApp 1 24
see android hidden files 10 96
This is an explanation of a simple data model to help parse a JSON feed
If your app took Google’s lash recently, here are the 5 most likely reasons.
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question