当前位置: 首页 > 知识库问答 >
问题:

根据int值更改文本切换器/视图切换器的文本颜色?

单琛
2023-03-14

我有一个从60000毫秒开始的倒计时计时器,想要从颜色更改文本颜色。蓝色到彩色。红色一旦时间在和低于10000毫秒。我尝试了以下方法,但没有任何成功;试图设置TextSwitcher的TextColor并添加IF语句,该语句将根据int值timerState更改颜色...除了停止计时器并在毫秒内创建另一个计时器之外,我不知道如何让它工作。

我单击一个imageButton,它启动一个对话框片段(PauseFragment),并通过timerCDT调用我的倒计时程序上的cancel()。取消()。我遇到了一些null指针问题,因此if语句在我的代码中检查null,但是现在一旦PauseFragment取消,我的新计时器将从60000开始,而不是从上次停止的位置开始。我希望每次调用onTick()时,long-timerState=60000都能更新到millisuntillfinished,但我不确定哪里出错了!

因此,有人可以帮助我动态更改TextSwitcher文本颜色,并帮助我找出为什么我的倒计时没有按预期值启动。非常感谢您的帮助。

提前谢谢!

 public class GameActivity extends FragmentActivity  implements PauseFragment.FragmentCommunicator,{

 public static long timerState = 60000;
    public static boolean isTimerOn = false;
    private String modeChoice = ModesActivity.mode;
    private TextSwitcher timerTextSwitcher;
    CountDownTimer timerCDT;


  @Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

//...more code

 timerTextSwitcher = (TextSwitcher) findViewById(R.id.timerTextSwitcher);
        timerTextSwitcher.setFactory(new ViewSwitcher.ViewFactory() {

            public View makeView() {
                // Create a new TextView and set properties
                TextView textView = new TextView(getApplicationContext());
                textView.setLayoutParams(new TextSwitcher.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                textView.setTextSize(20);
                textView.setTextColor(Color.BLUE);
                if (timerState < 10001) {
                    textView.setTextColor(Color.RED);
                }
                return textView;
            }
        });

  // Declare the 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 to textSwitcher
        timerTextSwitcher.setInAnimation(in);
        timerTextSwitcher.setInAnimation(out);
    }
    timerCDT = new CountDownTimer(timerState, 1000) {
        public void onTick(long millisUntilFinished) {
            isTimerOn = true;
            timerTextSwitcher.setText(String.valueOf(millisUntilFinished / 1000));
            timerState = millisUntilFinished;
        }

        //TODO: assign highscores for players to beat
        public void onFinish() {
            timerTextSwitcher.post(new Runnable() {
                @Override
                public void run() {
                    createToast("GAME OVER!");
                }
            });
            isTimerOn = false;

            DialogFragment endDialog = new EndGameFragment();
            endDialog.show(getSupportFragmentManager(), "EndGameDialogFragment");
        }
    };
    timerCDT.start();


 @Override
public void onPause() {
    super.onPause();
    Bundle args = new Bundle();
    args.putInt(ARG_SCORE, scoreINT);
    args.putLong(ARG_TIMER, timerState);
    args.putString(GameActivity.ARG_MODE, modeChoice);
    if (timerCDT != null) {
        timerCDT.cancel();
    }
    else{
        createToastExtended("onPause() - timerCDT is null; attempt to cancel");
    }
}

 //.!.other fun code here.!.

 @Override
 protected void onStop() {
    super.onStop();
    if (timerCDT != null) {
        timerCDT.cancel();
    }
    else{
        createToastExtended("onStop() - timerCDT is null; attempt to cancel");
    }

 }

 //Player Response information
 @Override
 public void pauseFragmentResponse() {
    if (timerCDT != null) {
        timerCDT.start();
    }
    else{
        createToastExtended("pauseFragmenResponse() - timerCDT is null; attempt to start");
    }
}

 public void pauseStartFrag(View view) {
    DialogFragment dialog = new PauseFragment();
    if (timerCDT != null) {
        timerCDT.cancel();
    }
    else{
        createToastExtended("pauseStartFrag() - timerCDT is null;attempt to cancel");
    }
    dialog.show(getSupportFragmentManager(), "PauseDialogFragment");
 }


 // Code for PauseFragment

 //TODO: remove unuses imports on all files within project; 

 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.DialogFragment;
 import android.view.LayoutInflater;

 public class PauseFragment extends DialogFragment {

public static boolean isPaused = false;
public FragmentCommunicator fComm;


@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        fComm = (FragmentCommunicator) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement FragmentCommunicator");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    fComm = null;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    isPaused = true;
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.fragment_pause, null))
           .setMessage(R.string.dialog_pause)
           .setPositiveButton(R.string.action_main_menu, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Intent i4 = new Intent(getActivity(), StartActivity.class);
                   startActivity(i4);
               }
           })
           .setNeutralButton(R.string.action_restart, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Intent i4 = new Intent(getActivity(), ModesActivity.class);
                   startActivity(i4);                   }
           })
           .setNegativeButton(R.string.action_resume, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
                   fComm.pauseFragmentResponse();
                   dismiss();
               }
           });
    // Create the AlertDialog object and return it
    return builder.create();
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    isPaused = false;
}

public interface FragmentCommunicator {
    public void pauseFragmentResponse();
}
 }

最后,Idk如果它有任何帮助,但是我也尝试在没有FragmentCommunicator接口的情况下启动倒计时计时器timerCDT,但是系统找不到计时器?如果有人能解释这件事发生的原因,我也会很感激的。

说真的,最后一件事,如果计时器是用于游戏的,并且需要经常停止和更新,那么最好使用CountDownTimer、TimerTask、一个实现Runnable的新线程、一个处理程序还是其他类型的?我都试过了,但当我向应用程序添加组件和功能时,我需要越来越多的灵活性来改变时间,不太确定我是否走上了正确的道路。希望这篇文章不要太含糊。请让我知道,如果我需要分为多个职位或东西。。。

一如既往地谢谢你!

共有3个答案

邓崇凛
2023-03-14

t1, t2;

textSwitcher = (TextSwitcher) findViewById(R.id.textView99);
textSwitcher.setInAnimation(this, R.anim.slide_in_right);
textSwitcher.setOutAnimation(this, R.anim.slide_out_left);
t1 = new TextView(this);
t2 = new TextView(this);
t1.setTextSize(20);
t2.setTextSize(20);
textSwitcher.addView(t1);
textSwitcher.addView(t2);
印季
2023-03-14

这个线程帮助我更容易地解决我的问题:

https://groups.google.com/forum/#!Android开发者jdlUp_RlP2w

您可以在textSwitcher中控制TextView,如下所示:

TextView t1 = (TextView) mSwitcher.getChildAt(0); 
TextView t2 = (TextView) mSwitcher.getChildAt(1); 

然后根据代码逻辑设置所需的任何颜色。

琴修为
2023-03-14

刚刚在开发者网站上看了一下http://developer.android.com/reference/android/os/CountDownTimer.html看起来您可能应该将if语句放在onTick方法中,所以对于每个勾号,您都要进行检查。

编辑

好的,这对我来说非常合适

private TextSwitcher TextSw;
private TextView TextSwTextView;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(com.game.test.R.layout.sample);


    TextSw = (TextSwitcher) findViewById(R.id.TextSwitchView);
    TextSw.setFactory(new ViewSwitcher.ViewFactory() 
    {

        public View makeView() 
        {
            // Create a new TextView and set properties
            TextView textView = new TextView(getApplicationContext());
            textView.setLayoutParams(new TextSwitcher.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            textView.setTextSize(20);
            textView.setTextColor(Color.BLUE);

            return textView;
        }
    });
    mtimer = new CountDownTimer(60000, 1000) 
    {

        public void onTick(long millisUntilFinished) 
        {
            TextSwTextView = (TextView) TextSw.getChildAt(0); 
            if(millisUntilFinished < 10001)
                TextSwTextView.setTextColor(Color.RED);
            TextSwTextView.setText("seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish()
        {
            TextSwTextView.setText("done!");
        }
     }.start();

}

上面是你的一个简单版本,当计时器达到1000时,显示计时器的文本将变为红色。你应该能够把这个融入你的生活。

但是这里你要做的主要事情是在onTick方法中检查计时器还有多少剩余,并在这里更改文本颜色,见上文

 类似资料:
  • 问题内容: 我有一个引导网站,当屏幕尺寸小于992px时,会添加Hamburger切换器。代码如下: 可以更改汉堡切换按钮的颜色吗? 问题答案: Bootstrap 4中的(汉堡包)使用SVG 。切换器图标图像有2个“版本”。一个用于浅色导航栏,另一个用于深色导航栏… 使用了较深的背景光/白色toggler 使用上较亮的背景黑色/灰色toggler 因此,如果要将切换器图像的颜色更改为其他颜色,可

  • 本文向大家介绍Android TextSwitcher文本切换器和ViewFlipper使用详解,包括了Android TextSwitcher文本切换器和ViewFlipper使用详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Android TextSwitcher文本切换器的使用,供大家参考,具体内容如下 1.TextSwitcher  使用: 应用分为三步: 1.得到 Tex

  • 我目前已经将JavaFX代码设置为在蓝色和红色之间切换。当程序运行时,一个带有文本“更改为红色”的按钮以蓝色文本出现。如果我点击这个按钮,它就会变成用红色文本写的“更改为蓝色”。如果我再次单击它,循环就会重新开始。我想做的是应用相同的图案,但使用四种颜色。例如,我希望它以: “变绿”,用红色文字书写。 然后在咔嚓一声之后。 “变紫”,用绿色文字书写。 有人能帮我把这个代码改成四种颜色吗?

  • update to revision:更新到指定版本。    

  • 问题内容: 故事:我拥有的其中一个应用程序可以在python 2.4上工作,而另一个可以在2.6上工作。我试图将python2.4链接到python,并且在ubuntu麻烦时事情开始崩溃。现在我正在下载2.4的每个依赖项,并使用python2.4 setup.py install进行安装。依赖性似乎是无限的。 问题1:我将如何告诉任何要使用版本的框架,例如pf python,如day django

  • 我已经尝试了android widget开关事件侦听器的答案中的代码,但帖子没有提到我试图使用它时遇到的错误。 在建议代码的第二行: 此错误触发 CompoundButton类型中的方法setOnCheckedChangeListener(CompoundButton. OnCheckedChangeListener)不适用于参数(new OnCheckedChangedListener(){})