1

Android は非常に新しく、しばらくの間これを調査しましたが、答えを見つけることができません。簡単な解決策があると確信しています。

私は私にNullPointException接続されているを取得していますView characterContainer = findViewById(R.id.icon_container);

私が理解しているように、onCreate()メソッドに実装しようとしているようで、レイアウトがまだ完全に準備されていないcharacterContainer = null.

だから私はそれをonStart()またはで使用する必要がありますonResume()が、私は苦労しています。これまでの私のコードは次のとおりです。

package harvest.life.game;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;

public class HarvestLifeActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //find buttons on screen
        Button up = (Button)findViewById(R.id.up);
        up.setOnTouchListener(new UpListener());
        Button down = (Button)findViewById(R.id.down);
        down.setOnTouchListener(new UpListener()); // set as UpListener also for test reasons
        Button left = (Button)findViewById(R.id.left); 
        left.setOnTouchListener(new UpListener()); // set as UpListener also for test reasons
        Button right = (Button)findViewById(R.id.right);
        right.setOnTouchListener(new UpListener()); // set as UpListener also for test reasons
    }
    //what up button does 
    private final class UpListener implements OnTouchListener {
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //as long as up button is pressed it will keep moving character up
                    while (event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        View characterContainer = findViewById(R.id.icon_container);
                        Drawable walking = getResources().getDrawable(R.drawable.test_circle_red);
                        int startX = characterContainer.getLeft();
                        int startY = characterContainer.getTop();
                        int defaultWidth = characterContainer.getWidth();
                        int defaultHeight = characterContainer.getHeight();

                        //create new position for character 1 pixel closer to the top of screen
                        int newX = startX - 1;
                        int newY = startY;

                        //remove character
                        RelativeLayout view = (RelativeLayout) characterContainer;
                        ViewGroup owner = (ViewGroup) view.getParent();
                        owner.removeView(view);

                        //re make character in new position created above and assign background as walking forwards animation
                        RelativeLayout.LayoutParams characParams = new RelativeLayout.LayoutParams(defaultWidth,defaultHeight);
                        characParams.leftMargin = newY;
                        characParams.topMargin = newX;
                        characterContainer.setLayoutParams(characParams);           
                        characterContainer.setBackgroundDrawable(walking); 
                    }
                    break;

                    // when button is let go of
                case MotionEvent.ACTION_UP:
                    RelativeLayout characterContainer = (RelativeLayout) 
                    findViewById(R.id.icon_container);
                    Drawable standing =
                        getResources().getDrawable(R.drawable.test_circle);
                    //assign background back to standing animation
                    characterContainer.setBackgroundDrawable(standing);
                default:
                    break;
            }
            return true;
        }
    }
    public void onResume() { // what goes here?

    }
}

セクションにある種の関数呼び出しを入れる必要がありますonResumeか、それとも が行うことのコードをOnTouchListenerここに入れる必要がありますか?

これが私のメインです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/game_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:background="#FFFFFF">

<RelativeLayout
    android:id="@+id/side_bar_right"
    android:layout_width="50dp"
    android:layout_height="fill_parent"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:background="#000000">

    <ImageView
        android:contentDescription="@string/movement_button"
        android:id="@+id/up"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="top"
        android:src="@drawable/up" />

    <ImageView
        android:contentDescription="@string/movement_button"
        android:id="@+id/down"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/down" />

    <ImageView
        android:contentDescription="@string/movement_button"
        android:id="@+id/right"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:src="@drawable/right" />

</RelativeLayout>

<RelativeLayout
    android:id="@+id/side_bar_left"
    android:layout_width="50dp"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" 
    android:background="#000000">

    <ImageView
        android:contentDescription="@string/movement_button"
        android:id="@+id/left"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:src="@drawable/left" />     

</RelativeLayout>

<RelativeLayout
    android:id="@+id/icon_container"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@drawable/test_circle"  >

</RelativeLayout >

</RelativeLayout>
4

1 に答える 1

0

これがあなたが望んでいたと思うものです:

package harvest.life.game;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;

public class HarvestLifeActivity extends Activity {
/** Called when the activity is first created. */
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //find buttons on screen
        Button up = (Button)findViewById(R.id.up);
        //up.setOnTouchListener(new UpListener());
        Button down = (Button)findViewById(R.id.up);
        //down.setOnTouchListener(new UpListener());
        Button left = (Button)findViewById(R.id.up);
        //left.setOnTouchListener(new UpListener());
        Button right = (Button)findViewById(R.id.up);
        //right.setOnTouchListener(new UpListener()); 
    }

    public void onDownButtonClick(View view){
        while (event.getAction() == MotionEvent.ACTION_DOWN)
        {

             View characterContainer = findViewById(R.id.icon_container);
             Drawable walking = getResources().getDrawable(R.drawable.test_circle_red);
             int startX = characterContainer.getLeft();
             int startY = characterContainer.getTop();
             int defaultWidth = characterContainer.getWidth();
             int defaultHeight = characterContainer.getHeight();

                 //create new position for character 1 pixel closer to the top of screen
                 int newX = startX - 1;
                 int newY = startY;

                 //remove character
                 RelativeLayout view = (RelativeLayout) characterContainer;
                 ViewGroup owner = (ViewGroup) view.getParent();
                 owner.removeView(view);

                 //re make character in new position created above and assign background as walking forwards animation
                 RelativeLayout.LayoutParams characParams = new RelativeLayout.LayoutParams(defaultWidth,defaultHeight);
                 characParams.leftMargin = newY;
                 characParams.topMargin = newX;
                 characterContainer.setLayoutParams(characParams);           
                 characterContainer.setBackgroundDrawable(walking); 
                 }
    }

    public void onUpButtonClicked(View view){
        RelativeLayout characterContainer = (RelativeLayout) 
                findViewById(R.id.icon_container);
        Drawable standing =
                getResources().getDrawable(R.drawable.test_circle);
         //assign background back to standing animation
        characterContainer.setBackgroundDrawable(standing);
    }

  }

ご覧のとおり、「ダウン」コードを関数に入れ、「アップ」コードを別の関数に入れました。次に、xml でandroid:onClick="onButtonDownClick"下ボタンに追加します。上ボタンにも同じことを行います (「onButtonUpClick」を除く)。これにより、これらの関数がクリック時に呼び出されます。Viewこれらの関数は引数としてa を取ることに注意することが重要です。

于 2012-04-16T15:37:07.157 に答える