Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee TextView_Android_Textview_Android Relativelayout_Marquee - Fatal编程技术网

Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee 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

我还没有找到解决我问题的办法,也许你可以在这里帮助我

我正在使用带有ImageView和TextView的RelativeLayout作为孩子。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);
    }
}
导入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()只被调用一次,并且字幕仍会重新启动。我错过了什么吗?可能是重复的