我有一个现有的TextView(在代码中它的名字 - 引用),我想用奇特的动画来改变它的文字。
创建改变文本的动画似乎唯一的方法是使用TextSwitcher。
我尝试使用此代码:
quoteSwitcher = (TextSwitcher)findViewById(R.id.quote_switcher);
quoteSwitcher.addView(quote);
Animation in = AnimationUtils.loadAnimation(this,
android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(this,
android.R.anim.fade_out);
quoteSwitcher.setInAnimation(in);
quoteSwitcher.setOutAnimation(out);
quoteSwitcher.setText("Example text");
此代码抛出异常:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我该怎么办?我只想用动画更改TextView文本。
完整代码:
protected void initWidgets() {
quote = (TextView)findViewById(R.id.quote); // Афоризм
/* Начальное значение афоризма */
quote.setText(getRandomQuote());
/* Плавная анимация смены афоризмов */
quoteSwitcher = (TextSwitcher)findViewById(R.id.quote_switcher);
quoteSwitcher.removeAllViewsInLayout();
quoteSwitcher.addView(quote);
Animation in = AnimationUtils.loadAnimation(this,
android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(this,
android.R.anim.fade_out);
quoteSwitcher.setInAnimation(in);
quoteSwitcher.setOutAnimation(out);
quoteSwitcher.setText(getRandomQuote());
}
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity"
android:orientation="vertical"
android:focusableInTouchMode="false"
android:id="@+id/main_layout">
<TextSwitcher
android:id="@+id/quote_switcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextSwitcher>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/logotype_layout">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/logotype"
android:layout_gravity="center_horizontal"
android:src="@drawable/logotype"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp" />
</RelativeLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/main_logotext"
android:id="@+id/logotext"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:textSize="55sp" />
<TextView
android:fontFamily="sans-serif-thin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/main_quote_0"
android:id="@+id/quote"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:textSize="15sp"
android:textStyle="italic" />
答案 0 :(得分:2)
您的问题是引用TextView
已经拥有父级LinearLayout
。
您可以尝试将自定义Factory
设置为TextSwitcher
quoteSwitcher.setFactory(new ViewFactory() {
public View makeView() {
// TODO Auto-generated method stub
// create new textView and set the properties like clolr, size etc
TextView myText = new TextView(MainActivity.this);
myText.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
myText.setTextSize(36);
myText.setTextColor(Color.BLUE);
return myText;
}
});
您可以从xml文件中删除引用TextView
,也可以删除quoteSwitcher.addView(quote);
。有关详细信息,请查看此blog。
答案 1 :(得分:0)
您的代码中的问题是您从xml中添加了一个已有父视图的textview。使用以下代码。在其中,我在运行时创建一个textview,没有现有父级,并将其添加到textWatcher,这将解决您的问题。
mSwitcher = (TextSwitcher) findViewById(R.id.textSwitcher);
mSwitcher.setFactory(new ViewFactory() {
public View makeView() {
// create new textView and set the properties like clolr, size etc
TextView myText = new TextView(MainActivity.this);
myText.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
myText.setTextSize(36);
myText.setTextColor(Color.BLUE);
return myText;
}
});
// Declare the in and out animations and initialize them
Animation in = AnimationUtils.loadAnimation(this,android.R.anim.slide_in_left);
Animation out = AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right);
// set the animation type of textSwitcher
mSwitcher.setInAnimation(in);
mSwitcher.setOutAnimation(out);