Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee TextView
我还没有找到解决我问题的办法,也许你可以在这里帮助我 我正在使用带有ImageView和TextView的RelativeLayout作为孩子。TextView包含一个大文本,应该从右向左滚动。但每次我在ImageView中设置一个新图像时,字幕都会从头开始 我认为,通过设置一个新图像,TextView会失去焦点,因此字幕会再次开始。我怎样才能防止这种情况发生,或者我是否有其他地方做错了?如果有人能给我指出正确的解决方案,那就太好了 非常感谢 您可以使用以下代码重现我的问题:Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee TextView,android,textview,android-relativelayout,marquee,Android,Textview,Android Relativelayout,Marquee,我还没有找到解决我问题的办法,也许你可以在这里帮助我 我正在使用带有ImageView和TextView的RelativeLayout作为孩子。TextView包含一个大文本,应该从右向左滚动。但每次我在ImageView中设置一个新图像时,字幕都会从头开始 我认为,通过设置一个新图像,TextView会失去焦点,因此字幕会再次开始。我怎样才能防止这种情况发生,或者我是否有其他地方做错了?如果有人能给我指出正确的解决方案,那就太好了 非常感谢 您可以使用以下代码重现我的问题: import an
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);
}
}
导入android.app.Activity;
导入android.graphics.Color;
导入android.os.Bundle;
导入android.os.Handler;
导入android.text.TextUtils.TruncateAt;
导入android.view.Display;
导入android.widget.ImageView;
导入android.widget.ImageView.ScaleType;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
公共类RelativeLayoutActivity扩展活动{
私有图像视图mImageView;
私有文本视图mTextView;
私有处理程序mHandler=新处理程序();
private int mCurrentImage=0;
private Runnable mCallback=new Runnable(){
@凌驾
公开募捐{
切换图像();
}
};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initLayout();
setLongText();
mHandler.postDelayed(mCallback,5000);
}
私有void initLayout(){
RelativeLayout布局=(RelativeLayout)findViewById(R.id.parentLayout);
Display Display=getWindowManager().getDefaultDisplay();
int screenWidth=display.getWidth();
int screenHeight=display.getHeight();
mImageView=新的图像视图(此);
mImageView.setScaleType(ScaleType.FIT_XY);
RelativeLayout.LayoutParams rlp=新的RelativeLayout.LayoutParams(屏幕宽度、屏幕高度);
setImageDrawable(this.getResources().getDrawable(R.drawable.red));
layout.addView(mImageView,rlp);
//底部的选框文本
mTextView=新文本视图(此);
mTextView.setSingleLine();
mTextView.setEllipsize(TruncateAt.MARQUEE);
mTextView.setMarquerePeatLimit(-1);
mTextView.setHorizontallyScrolling(true);
mTextView.setFocusable(true);
mTextView.setFocusableInTouchMode(true);
mTextView.setBackgroundColor(Color.BLACK);
mTextView.setTextColor(Color.WHITE);
rlp=新的RelativeLayout.LayoutParams(屏幕宽度,50);
rlp.topMargin=屏幕高度-100;
layout.addView(mTextView,rlp);
}
私有void setLongText(){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i请参见我的答案:
这个想法是:
- 以编程方式固定宽度和高度(您已经这样做了)
- (你做到了)
- 覆盖TextView以修复焦点问题的步骤
我有一个相同的问题,我刚刚解决了:)
如果布局XML中包含布局权重的TextView
android:layout_weight="1"
移除它!这将导致字幕重新启动
希望对您有所帮助:)只是一个简单的解决方案:)无需太多担心…只需将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!!" />
选框重置问题是由于运行它的TextView的焦点丢失造成的。要解决这些问题,您只需使用另一个RelativeLayout
环绕您的TextView,使其与其他视图位于不同的视图组中
您还有另一个选择:创建一个新类,它是TextView的子类,并覆盖onFocusChanged
和onWindowFocusChanged
,以防止所述TextView失去焦点
就是这样。使用这些技术,你的选框不会在每次其他元素获得焦点时重新启动。嗨,这对我不起作用。我添加了你的ScrollingTextView,还添加了“onSizeChanged”的覆盖,因为我在API 10上。然后我用ScrollingTextView实例替换了我的TextView,还添加了mTextView.setEnabled(对)。但是ScrollingTextView.onSizeChanged()只被调用一次,并且字幕仍会重新启动。我错过了什么吗?可能是重复的