LolloAAA
LolloAAA

Reputation: 110

ImageView in SurfaceView without XML

My question is if is possible add an ImageView in a SurfaceView without XML. If yes, how? I have a main class that has the function of GamePanel, and for apply a Method i need to call it with an ImageView, but i don't know if it is possible. Thanks you in advance.

Upvotes: 0

Views: 778

Answers (1)

Devendra Vaja
Devendra Vaja

Reputation: 3964

You need to read about the View and ViewGroups provided by the Android Framework.

I am giving the quick understanding to propose the solution.

Crash Course about View & ViewGroup

At the root of the Android UI system, everything is View.

What is a View?
It is a single widget / UI component that can be displayed on the screen. The View includes Buttons, TextViews, ImageViews, SurfaceView. They can not contain any child view i.e. They can not hold declaration for the any other child view

Following XML definition is incorrect: A view can not hold another view

<SurfaceView 
        android:id="@+id/textSurfaceView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
            <ImageView android:id="@+id/imageView"  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"/>
</SurfaceView>

What is ViewGroup?

Inherited from View and designed to contain and arrange more than one View also called as Child views. The various ViewGroups are LinearLayout, RelativeLayout, FrameLayout etc.

Following XML definition is Correct: A ViewGroup can hold another view

<FrameLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">   
    <SurfaceView 
        android:id="@+id/surfaceView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>
    <ImageView android:id="@+id/imageView"  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"/>
</FrameLayout>

Here comes the solution
Step-1: Add a ViewGroup in your XML wrapping the existing SurfaceView. As mentioned already the ViewGroups are LinearLayout, RelativeLayout, FrameLayout etc.

res/layouts/your_layout.xml

<FrameLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/baseFrame"
 android:layout_width="match_parent"
 android:layout_height="match_parent">   
    <SurfaceView 
        android:id="@+id/surfaceView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>
</FrameLayout>

Step-2: At the time of view creation add an ImageView to the FrameLayout. onCreate() activity.

setContentView(R.layout.your_layout);
FrameLayout baseFrame = (FrameLayout) findViewById(R.id.baseFrame);

ImageView imageView = new ImageView(this);
imageView.setWidth(/*As per your need*/);
imageView.setHeight(/*As per your need*/);
imageView.setId(/*Any unique positive Number*/ R.ids.imageView1); <= Required to access this view later
/*Set the layout parameters such as layout_gravity as well.*/
baseFrame.addView(imageView); 

Step-3: I know you must be wondering about the ImageView Id. I am giving the quicker way to assign an ID to a View.

  • Create a file ids.xml at res/values
  • Fill the following details.

    <resources>
        <item type="id" name="imageView1" />
    </resources>
    

Step-4: Passing an ImageView to the method

ImageView myImageView = (ImageView) findViewById(R.id.imageView1);
methodToBeCalled(myImageView);

I hope that helps.
Happy Coding!!!

Upvotes: 1

Related Questions