0

最も関連性の高いコードを以下に示します

ボタンを拡張する「TestButton」が押されると、そのビューが「TestButton」コードに渡され、そのボタン/ビューをアニメーション化できます。しかし、別のビューもアニメーション化したいと考えています。ここで作成しているビューとは別のビューをアニメーション化するにはどうすればよいですか、またはアクティビティに DO ACTION を通知するにはどうすればよいですか? これはタッチされたボタンで機能します:

startAnimation(animationstd);

しかし、別のボタンでは:

useiv.startAnimation(animationstd);

NULL ポインター例外が発生します。

コード:

package de.passsy.multitouch;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

public class TestButton extends Button {

public TestButton(final Context context, final AttributeSet attrs) {
    super(context, attrs);

}

@Override
public boolean onTouchEvent(final MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
            final Animation animationstd = AnimationUtils.loadAnimation(getContext(),
            R.anim.fromleft);
    useiv = (TestButton) findViewById(R.id.imageButton1); 
    useiv.startAnimation(animationstd); //this line = null pointer exception
    }
    return super.onTouchEvent(event);
}
}
4

1 に答える 1

1

ボタンが配置されているレイアウトへの参照を渡していないためfindViewById、内部から呼び出すことはできません。クラスの外部で呼び出して、アニメーション化する必要があるボタンを見つけてから、その参照を渡す必要があります。このような:TestButtonfindViewById()TestButton

public class TestButton extends Button {

    TestButton mImageButton; // You were calling it useiv

    public TestButton(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    public setAnotherButtonToAnimate(TestButton button) {
        this.mImageButton = button;
    }

    @Override
    public boolean onTouchEvent(final MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            final Animation animationstd = AnimationUtils.loadAnimation(getContext(), R.anim.fromleft);
            if (mImageButton != null) {
                mImageButton.startAnimation(animationstd);
            }
        }
        return super.onTouchEvent(event);
    }
}

次に、あなたのonCreate()方法で:

@Override
public void onCreate(final Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().clearFlags(
            WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TestButton imageButton1 = (TestButton) findViewById(R.id.imageButton1);
    (...)
    btn4 = (TestButton) findViewById(R.id.button4);
    btn4.setAnotherButtonToAnimate(imageButton1);
    btn4.setOnTouchListener(this);
于 2013-06-11T12:09:08.110 に答える