Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee-TextView

时间:2011-11-20 17:28:33

标签: android textview relativelayout marquee

我没有为我的问题找到解决方案,也许你可以在这里帮助我。

我使用RelativeLayout和ImageView以及TextView作为子项。 TextView包含一个大文本,应该从右向左滚动。但每当我将新图像设置到ImageView时,选取框就从头开始。

我认为通过设置一个新图像,TextView会失去焦点,因此选取框会重新开始。我该如何防止这种情况或者我还有其他错误?如果有人能指出我正确的解决方案,那就太好了。

非常感谢!

您可以使用以下代码重现我的问题:

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils.TruncateAt;
import android.view.Display;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class RelativeLayoutActivity extends Activity {

    private ImageView mImageView;
    private TextView mTextView;

    private Handler mHandler = new Handler();
    private int mCurrentImage = 0;

    private Runnable mCallback = new Runnable() {
        @Override
        public void run() {
            toggleImage();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        initLayout();
        setLongText();

        mHandler.postDelayed(mCallback, 5000);
    }

    private void initLayout() {
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.parentLayout);

        Display display = getWindowManager().getDefaultDisplay(); 
        int screenWidth = display.getWidth();
        int screenHeight = display.getHeight();

        mImageView = new ImageView(this);
        mImageView.setScaleType(ScaleType.FIT_XY);
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(screenWidth,screenHeight);        
        mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.red));
        layout.addView(mImageView, rlp);

        // marquee text at the bottom
        mTextView = new TextView(this);
        mTextView.setSingleLine();
        mTextView.setEllipsize(TruncateAt.MARQUEE);
        mTextView.setMarqueeRepeatLimit(-1);
        mTextView.setHorizontallyScrolling(true);
        mTextView.setFocusable(true);
        mTextView.setFocusableInTouchMode(true);
        mTextView.setBackgroundColor(Color.BLACK);
        mTextView.setTextColor(Color.WHITE);

        rlp = new RelativeLayout.LayoutParams(screenWidth, 50);
        rlp.topMargin = screenHeight-100;
        layout.addView(mTextView, rlp);
    }

    private void setLongText() {
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<50; i++) {
            sb.append(" ");
        }
        for (int i=0; i<50; i++) {
            sb.append("A");
        }
        for (int i=0; i<50; i++) {
            sb.append("B");
        }
        for (int i=0; i<50; i++) {
            sb.append("C");
        }
        mTextView.setText(sb.toString());
        mTextView.setSelected(true);
    }

    private void toggleImage() {
        mCurrentImage++;
        if (mCurrentImage % 2 == 0) {
            mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.red));
        } else {
            mImageView.setImageDrawable(this.getResources().getDrawable(R.drawable.green));
        }

        mHandler.postDelayed(mCallback, 5000);
    }
}

4 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,我刚刚解决了这个问题:)

如果布局XML中的TextView包含layout_weight

android:layout_weight="1"

删除它!此属性会导致选取框重启。

希望有帮助:)

答案 1 :(得分:2)

选取框重置问题是因为运行它的TextView的失去焦点。要解决这些问题,您可以使用另一个RelativeLayout将TextView包围起来,以便它与其他视图位于不同的ViewGroup中。

您还有另一种选择:创建一个新类,它是TextView的子类,并覆盖onFocusChangedonWindowFocusChanged,以防止失去对所述textview的焦点。

就是这样。使用这些技术,每当另一个元素获得焦点时,您的选取框将不会重新启动。

答案 2 :(得分:0)

请在此处查看我的回答:https://stackoverflow.com/a/13841982/1823503

这个想法是:

  • 以编程方式修改宽度和高度(你做到了)
  • 到setSelected(你做到了)
  • 覆盖TextView以解决焦点问题

答案 3 :(得分:0)

只是一个简单的修复.. :)无需担心太多...只需将textview的宽度固定为800dp或更高的宽度。它将解决重置问题

    <TextView
    android:id="@+id/adv_txt_view"
    android:layout_width="800dp"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:singleLine="true"
    android:ellipsize="marquee"                               

    android:fadingEdge="horizontal"
    android:marqueeRepeatLimit="marquee_forever"                           
    android:focusableInTouchMode="true"                           
    android:focusable="true"                     
    android:scrollHorizontally="true"                       
    android:textColor="@color/black"
    android:text="large text to scroll!!" />