2

私のアプリケーションでは、メニューボタンを押すと現在のアクティビティの上に開くアクティビティがあります。このオーバーレイでは、アクティビティが表示されたときにビューをフェードインし、アクティビティが閉じる前に再びフェードアウトしたいと思います。これが私のコードです:

public class OverlayActivity extends Activity {
TextView t;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.overlay);
    t = (TextView) findViewById(R.id.view_overlay_text);
    t.setAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    boolean r = false;
    switch (keyCode) {
    case KeyEvent.KEYCODE_BACK:
        finishOverlay();
        r = true;
        break;
    default:
        r = super.onKeyDown(keyCode, event);
        break;
    }
    return r;
}

private void finishOverlay() {
    Animation a = AnimationUtils.loadAnimation(this, R.anim.fade_out);
    a.setAnimationListener(fadeOutComplete);
    t.setText("TEST"); // <--- if i add this line the code suddenly works
    t.setAnimation(a);
}

Animation.AnimationListener fadeOutComplete=new Animation.AnimationListener() {
    public void onAnimationEnd(Animation animation) {
        finish();
    }

    public void onAnimationRepeat(Animation animation) {
        // not needed
    }

    public void onAnimationStart(Animation animation) {
        // not needed
    }
};

}

どういうわけか、fadeOut-Animationは、t.setText( "sometext")のようなことをした場合にのみ機能します。その行を省略した場合、アニメーション化されないため、AnimationListenerはトリガーされません。

更新:さらにいくつかの情報で問題が明確になります:onCreate:TextViewがフェードインし、画面に表示されますonKeyDown "BACK":finishOverlayが呼び出されます。(実際にはそうです)finishOverlay:フェードしたいビューにアニメーションが適用されていません。なんで?同じリファレンスです。それはある種のスコーピング問題でしょうか?

4

2 に答える 2

0

コードを更新しましたが、このコードは希望どおりに機能しています。

public class mp3list extends Activity {
TextView t;
Animation a;
Animation.AnimationListener fadeOutComplete;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mp3list);
    t = (TextView) findViewById(R.id.tvc);  
    run();
    startOverlay();
   }

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean r = false;

switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
    run();
    finishOverlay();
    r = true;        
    break;
default:
    r = super.onKeyDown(keyCode, event);
    break;

}
return r;
}

private void startOverlay() {

a = AnimationUtils.loadAnimation(this, R.anim.fade_in);
a.setAnimationListener(fadeOutComplete);
t.setText("helo world"); // <--- if i add this line the code suddenly works
t.setAnimation(a);
}

private void finishOverlay() {
 a = AnimationUtils.loadAnimation(this, R.anim.fade_out);
 a.setAnimationListener(fadeOutComplete);
 t.setText("helo world"); // <--- if i add this line the code suddenly works
 t.setAnimation(a);
 finish();
}

public void run(){

    fadeOutComplete = new Animation.AnimationListener() {
        public void onAnimationEnd(Animation animation) {

        }

        public void onAnimationRepeat(Animation animation) {
            // not needed
        }

        public void onAnimationStart(Animation animation) {
            // not needed
        }
        };
    }

}    
于 2015-08-05T05:21:35.960 に答える
0

テキストビューの XML コードを投稿する必要があります。

テキストビューのテキストが空白であると思われます...したがって、アニメーションは発生しません。

また、コードでテキストビューの可視性を設定するのはなぜですか。textview は onCreate メソッドに表示されるため、XML ファイルで非表示に設定してはならないため、この行は必要ありません。

于 2010-11-11T12:59:07.653 に答える