2011-11-20 84 views
3

我还没有找到解决方案来解决我的问题,也许你可以在这里帮助我。Android,RelativeLayout在同一RelativeLayout中更改ImageView时重新启动Marquee-TextView

我正在使用带有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); 
    } 
} 
+0

可能重复的[TextView重新启动字幕更改另一个TextView在同一个LinearLayout](http://stackoverflow.com/questions/11856875/textview-restarts-marquee-when-changing-another-textview-in-same-linearlayout ) – Mogsdad

回答

0

见我的答案在这里:https://stackoverflow.com/a/13841982/1823503

的理念是:

  • 固定的宽度和高度编程(你做它)
  • setSelected(你做到了)
  • 重写你的TextView固定焦点问题
+0

嗨,这不适合我。我已经添加了您的ScrollingTextView,并且还添加了“onSizeChanged”的覆盖,因为我在API 10上。然后,我用ScrollingTextView实例替换了我的TextView,并且还添加了mTextView.setEnabled(true)。但是ScrollingTextView。onSizeChanged()只调用一次,而选取框仍然重新启动。我错过了什么? – robotniko

3

我有同样的问题,我固定它刚才:)

如果你的TextView其在布局XML包含layout_weight

android:layout_weight="1" 

删除它!这attibute导致选框重新启动。

希望有帮助:)

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!!" /> 
0

选取框复位的问题,是因为它在其上运行的TextView的焦点的损失。为了克服这些问题,您可以简单地将TextView与另一个环绕起来,以便它与其他视图位于不同的ViewGroup中。

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

就是这样。使用这些技术,每当其他元素获得焦点时,选取框都不会重新启动。