2011-11-20 137 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以防止對所述文本視圖失去焦點。

就是這樣。使用這些技術,每當其他元素獲得焦點時,選取框都不會重新啓動。

相關問題