Random button Android project

I want to make an app that when you click a button it will go to a random place on the screen. I want it to be an ImageButton the when onClick well go to a random place on the screen. I've attempted before. But to no success. Here is some of the code I've already attempted with. --->

package com.example.e99900004533.candycollector;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.graphics.Point;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Display;
import android.view.ViewGroup.MarginLayoutParams;
import android.animation.ObjectAnimator;
import android.widget.RelativeLayout;
import android.widget.EditText;
import android.widget.ImageButton;
import java.util.Random;

public class MainActivity extends ActionBarActivity {

    public EditText collectedTextEdit;
    public ImageButton candyEdit;
    public int collected = 0;
    public int screenWidth = 300;
    public int screenHeight = 300;
    Random random = new Random();
    public boolean running = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        collectedTextEdit = (EditText) findViewById(R.id.collectedText);
        candyEdit = (ImageButton) findViewById(R.id.candy);
        collectedTextEdit.setText("Collected: " + collected);

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
        screenHeight = size.y;

        addListenerOnButton();
    }

    public void addListenerOnButton() {
        candyEdit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                collected += 1;
                collectedTextEdit.setText("Collected: " + collected);

                int candyX = random.nextInt(screenWidth - 50);
                int candyY = random.nextInt(screenHeight - 50);
                System.out.println(candyX + " : " + candyY);

                MarginLayoutParams marginParams = new MarginLayoutParams(candyEdit.getLayoutParams());
                marginParams.setMargins(candyX, candyY, 0, 0);
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
                candyEdit.setLayoutParams(layoutParams);

                //if (candyX > screenWidth) {
                    //screenWidth -= 50;
                    //layoutParams.setMargins(candyX, candyY, candyX, LayoutParams.WRAP_CONTENT);
                    //candyEdit.setLayoutParams(layoutParams);
                //}
                //if (candyY > screenHeight) {
                    //screenHeight -= 50;
                    //layoutParams.setMargins(candyX, candyY, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                    //candyEdit.setLayoutParams(layoutParams);
                //}

                //while (running == true) {
                    //candyY -= 1;
                    //layoutParams.setMargins(candyX, candyY, candyX, candyY);
                    //candyEdit.setLayoutParams(layoutParams);
                //}
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Upvotes: 0

Views: 1916

Answers (1)

nonamorando
nonamorando

Reputation: 1605

I hope you are using Android Studio as it gives you a beautiful way of accessing all the benefits of the Android API.

Anyway, before I post the code, you set the onClickListener within your java code and while that is fine, it can clutter up your code. A much more aesthetically pleasing solution is to use XML and a button's android:onClick. You will see this in the code.

Java:

package testinc.com.randombutton;

import android.graphics.Point;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.*;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends ActionBarActivity {

    // Encapsulating the data just to be safe...
    private int collected = 0;
    private int screenWidth = 300;
    private int screenHeight = 300;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
        screenHeight = size.y;

        TextView collectedView = (TextView) findViewById(R.id.collectedTV);
        collectedView.setText("Collected: " + collected);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void toRandomPosition(View view) {
        // Based on our collection candy collection:
        collected += 1;
        TextView collectedView = (TextView) findViewById(R.id.collectedTV);
        collectedView.setText("Collected: " + collected);

        // Based on position of our candy:
        Random random = new Random();
        // Understand nextInt(N) will go from 0 -> N-1, also are you trying to control where it can go?
        float candyX = (float) random.nextInt(screenWidth - 50);
        float candyY = (float) random.nextInt(screenHeight - 50);
// I didn't write it, but you need to check these float values if they   exceed the screen width and the screen length. */
        // Sout to check coordinates
        System.out.println(candyX + " : " + candyY);

        // To change margins:
        ImageButton imgButton = (ImageButton) findViewById(R.id.changePlace);
        imgButton.setX(candyX);
        imgButton.setY(candyY);
    }
}

Android: Note: I used a linear layout because I dislike the relative. You can change it without repercussions I suppose.

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">
    <TextView android:id="@+id/collectedTV"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
    <ImageButton android:id="@+id/changePlace"
                 android:onClick="toRandomPosition"
                 android:contentDescription="It's a button, ha za"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>

</LinearLayout>

Key parts:

android:onClick="toRandomPosition" hooks up with the method, public void toRandomPosition(View view)

setX and setY require floating point numbers to set the position. Unfortunately, it seems that the random class does not have nextFloat(float n) in its class. I recommend just casting the int as a float for now.

Seeing that I am doing this now, here is a possible (I have not checked it) solution to the coordinates going beyond the bounds of the screen:

while ( candyX >= screenWidth || candyY >= screenHeight) {
  candyX = (float) random.nextInt(screenWidth - 50); 
  candyY = (float) random.nextInt(screenHeight - 50);
}

I checked if the position was equal because a button at the corner of the screen is a pain to find and may be skewed off the display.

Upvotes: 1

Related Questions