почему значение LocalDate не установлено на сегодняшнюю дату - PullRequest
3 голосов
/ 21 января 2020

так что у меня есть 7 разных кнопок, я хочу sethint на каждом button с текущим date++ в порядке.

DateTimeFormatter dateFormater = DateTimeFormatter.ofPattern("d");
        ZoneId zone = ZoneId.of("Asia/Jakarta");
        LocalDate date = LocalDate.now(zone);
        int amount = 1;
        int buttonCount = 7;
        for (int i = 0; i < buttonCount; i++){
            hari1.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari2.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari3.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari4.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari5.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari6.setHint(date.format(dateFormater));
            date = date.plusDays(amount);
            hari7.setHint(date.format(dateFormater));
        }

дата начала вывода 27-28 -29 и т. Д. что неправильно, потому что сегодня дата 22 * ​​1011 *. вывод должен быть 22-23-24 т. д. верно? поэтому я попытался использовать календарь на дату, и вывод правильный 22 * ​​1015 *. Почему ? и есть ли решение, чтобы я мог получить правильную дату и получить ее (дата ++)? и есть ли другой подход? как?

        Date today = Calendar.getInstance().getTime();
        final SimpleDateFormat fcDate = new SimpleDateFormat("dd");

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Проблема с вашим кодом состоит в том, что на каждой из 7 итераций l oop вы назначаете подсказки для всех кнопок, поэтому вы делаете 7 назначений для каждой кнопки, всего 49 назначений, увеличивая дату после каждое назначение, так что вы достигнете этих неправильных дат. В результате вы видите значения, назначенные на последней итерации, которые явно неверны. Делайте 1 присваивание 1 кнопке в каждой итерации следующим образом:

DateTimeFormatter dateFormater = DateTimeFormatter.ofPattern("d");
ZoneId zone = ZoneId.of("Asia/Jakarta");
LocalDate date = LocalDate.now(zone);
int amount = 1;
int buttonCount = 7;
for (int i = 0; i < buttonCount; i++){
    int buttonId = getResources().getIdentifier("hari_" + (i + 1), "id", getPackageName()); 
    Button button = (Button) findViewById(buttonId);
    button.setHint(date.format(dateFormater));
    date = date.plusDays(amount);
}

С этой строкой:

int buttonId = getResources().getIdentifier("hari_" + (i + 1), "id", getPackageName());

вы получите целое число id каждой кнопки и с этой строкой:

Button button = (Button) findViewById(buttonId);

вы получите переменную, ссылающуюся на кнопку.

2 голосов
/ 22 января 2020

Использование потока

Ответ forpas правильный. Для развлечения давайте попробуем использовать поток. Я не утверждаю, что это лучше, чем другое первое решение, просто альтернатива.

Мы используем IntStream для подсчета до семи. Мы используем полученное целое число, чтобы добавить количество дней к нашей текущей дате и получить доступ к определенной кнопке c, используя подход именования, показанный в этом другом ответе.

Вместо go через DateTimeFormatter, чтобы получить день месяца, мы звоним LocalDate::getDayOfMonth. Преобразование из int в строку через String.valueOf.

Я не пробовал запускать этот код, так как я не выполняю Android работу. Но, надеюсь, это близко к работе.

ZoneId z = ZoneId.of( "Asia/Jakarta" ) ;
LocalDate today = LocalDate.now( z ) ;

IntStream
.range( 0 ,  7 )
.forEach( 
    i -> 
    ( 
        (Button) findViewById( 
            getResources().getIdentifier( "hari_" + (i + 1), "id" , getPackageName() )   // See: https://stackoverflow.com/a/59849331/642706  
        ) 
    )                         // Returns a `Button`.
    .setHint ( 
        String.valueOf(       // Convert int (day-of-month) to text.
            today
            .plusDays( i )    // Produces a new `LocalDate` object rather than modifying the original (immutable objects). 
            .getDayOfMonth()  // Returns an `int`. 
        )
    )  
    ;
)
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...