Невозможно установить таймер в Snackbar

Я пытаюсь установить таймер в своей Снэк-бар, я пробовал это до сих пор и получил таймер для работы, но не в getTime() метод, который я думаю, может иметь место, именно поэтому это не работает.

Извините, если это слишком плохо, я делаю Android только как побочный проект.

public class MainActivity extends AppCompatActivity {

private static final String AUDIO_RECORDER_FILE_EXT = ".3gp";
private static final String AUDIO_RECORDER_FOLDER = "VRemind";
private MediaRecorder recorder = null;
private int currentFormat = 0;
private int output_format = MediaRecorder.OutputFormat.THREE_GPP;
private String file_ext = AUDIO_RECORDER_FILE_EXT;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   final CountDownTimer t;


    t = new CountDownTimer( Long.MAX_VALUE , 1000) {

        int cnt=0;

        @Override
        public void onTick(long millisUntilFinished) {

            cnt++;
            long millis = cnt;
            int seconds = (int) (millis / 60);

            setTime(cnt);
            Log.d("Count:", ""+cnt);
        }

        @Override
        public void onFinish() {

        }
    };

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    final Snackbar snackbar = Snackbar.make(findViewById(R.id.root_layout), getTime(), Snackbar.LENGTH_INDEFINITE);

    final FloatingActionButton fabAdd = (FloatingActionButton) findViewById(R.id.fabAdd);
    final FloatingActionButton fabStop = (FloatingActionButton) findViewById(R.id.fabStop);

    fabAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            t.start();
            fabAdd.setVisibility(View.GONE);
            fabStop.setVisibility(View.VISIBLE);
            snackbar.show();
            snackbar.setAction("CANCEL", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                    fabAdd.setVisibility(View.VISIBLE);
                    fabStop.setVisibility(View.GONE);
                }
            });

        }
    });

    fabStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            t.cancel();
            snackbar.dismiss();
            fabStop.setVisibility(View.GONE);
            fabAdd.setVisibility(View.VISIBLE);
        }
    });




}




private String display;

public void setTime(int rawCount) {

    int rc = rawCount;

    int minutes = (rc - (rc % 60)) / 60;
    int seconds = (rc % 60);

    String mins = String.format(Locale.ENGLISH, "%02d", minutes);
    String secs = String.format(Locale.ENGLISH, "%02d", seconds);
    display = mins+ ":" +secs;

    Log.d("CountTwo:",display);
    getTime();

}

public String getTime() {

    Log.d("Count getTime:", display);
    return display;
}

2 ответа

Решение

Я посмотрел на это, и проблема заключалась в том, что строка display был недоступен для Snackbar, а также тест Snackbar не мог динамически обновляться, поэтому я сделал оба из них и сделал несколько изменений здесь и там, и вот мой код:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       final CountDownTimer t;


        t = new CountDownTimer( Long.MAX_VALUE , 1000) {

            int cnt=0;

            @Override
            public void onTick(long millisUntilFinished) {

                cnt++;
                long millis = cnt;
                int seconds = (int) (millis / 60);

                setTime(cnt);
                Log.d("Count:", ""+cnt);
            }

            @Override
            public void onFinish() {
                cnt = 0;
            }

        };

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        snackbar = Snackbar.make(findViewById(R.id.root_layout), "", Snackbar.LENGTH_INDEFINITE);

        final FloatingActionButton fabAdd = (FloatingActionButton) findViewById(R.id.fabAdd);
        final FloatingActionButton fabStop = (FloatingActionButton) findViewById(R.id.fabStop);

        fabAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                t.start();
                fabAdd.setVisibility(View.GONE);
                fabStop.setVisibility(View.VISIBLE);
                snackbar.show();
                snackbar.setAction("CANCEL", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        t.cancel();
                        t.onFinish();
//                        setTime(0);
                        snackbar.dismiss();
                        fabAdd.setVisibility(View.VISIBLE);
                        fabStop.setVisibility(View.GONE);
                    }
                });

            }
        });

        fabStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                t.cancel();
                t.onFinish();
//                setTime(0);
                snackbar.dismiss();
                fabStop.setVisibility(View.GONE);
                fabAdd.setVisibility(View.VISIBLE);
            }
        });




    }


    /*
        public void Duration() {
        *//*        Timer timer = new Timer();

            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {

                    runOnUiThread(new Runnable() {
                        int count;

                        @Override
                        public void run() {
                            setTime(count);
                            count++;
                            Log.d("Count:", ""+count);
                        }
                    });
                }
            };*//* //Old code removed on 22Apr17@11:41PM


        }*/ //Old code Duration method

     String display="";

    public void setTime(int rawCount) {

//        int rc = rawCount;

        int minutes = (rawCount - (rawCount % 60)) / 60;
        int seconds = (rawCount % 60);

        String mins = String.format(Locale.ENGLISH, "%02d", minutes);
        String secs = String.format(Locale.ENGLISH, "%02d", seconds);
        display = mins+ ":" +secs;

        Log.d("CountTwo:",display);
        snackbar.setText(display);

    }

    /*public String getTime() {

        Log.d("Count getTime:", display);
        return display;
    }*/

Вы получаете это сообщение?

java.lang.NullPointerException: println нужно сообщение

Если да, это потому, что вы пытаетесь записать пустое сообщение, как это:

Log.d("Count getTime:", display);

Вы должны инициализировать переменную отображения, чтобы иметь значение для первого запуска.

private String display = "";
Другие вопросы по тегам