В приложении нужно добиться того, чтобы была возможность листать "страницы", где на одной из них, выборочно, по нажатию кнопки запускался свой таймер.
Время действия таймера на каждой странице разное.
Перелистывание "страниц" было решено осуществить с помощью VievPager
Первоначальный код делал как по образцам в интернете:
1) Код в MainActivity:
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager pager=(ViewPager)findViewById(R.id.pager);
pager.setAdapter(new MyAdapter(getSupportFragmentManager()));
pager.setCurrentItem(1); //Для того, чтобы при запуске открывалась вторая страница
}
}
2) Код в MyAdapter:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager mgr) {
super(mgr);
}
@Override
public int getCount() {return(3);} //Колличество страниц (3)
@Override
public Fragment getItem(int position) { //getItem создаёт новую страницу
return(PageFragment.newInstance(position));
}
}
3) Код в PageFragment:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class PageFragment extends Fragment {
//Объявляю объекты
private int pageNumber; //Номер страницы
Timer MyTimer; //Таймер
TimerTask MyTimerTask; //Задача для таймера
int Timercount; //Счётчик таймера
//Если не ошибась, то это для создания Fragment'а
public static PageFragment newInstance(int page) {
PageFragment fragment = new PageFragment();
Bundle args=new Bundle();
args.putInt("num", page);
fragment.setArguments(args);
return fragment;
}
//Расписываю onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Это, вроде, чтобы небыло ошибок
if (getArguments() != null) {pageNumber = getArguments().getInt("num");}
else {pageNumber = 1;}
//В зависимости от страницы изменяется время таймера
if (pageNumber == 1) {Timercount = 1000;}
if (pageNumber == 2) {Timercount = 2000;}
if (pageNumber == 3) {Timercount = 3000;}
}
//Не знаю для чего это, но оны было в образце
public PageFragment() {}
//Расписываю onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//Расписываю кнопку
Button buttonStart = (Button)getActivity().findViewById(R.id.btn_start);
//Устанавливаю Listener для кнопки
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MyTimer != null) {MyTimer.cancel();} //Останавливаем старый таймер, если он идёт
MyTimer = new Timer(); //Объявляю таймер
MyTimerTask = new timerTask(); //Обявляю задачу для таймера
MyTimer.schedule(MyTimerTask, 1000, 1000); //Раписываю шаг таймера
}
});
//Для того, чтобы было написано какой это фрагмент
View result=inflater.inflate(R.layout.fragment_page, container, false);
TextView pageHeader=(TextView)result.findViewById(R.id.displayText);
String header = ("Фрагмент " + String.valueOf(pageNumber+1));
pageHeader.setText(header);
//Возвращаю result (Не знаю зачем, но так было в образце)
return result;
}
//Расписываю действие для таймера
private class timerTask extends TimerTask {
@Override
public void run() {
Timercount = Timercount - 1; //Это чтобы время таймера уменьшалось
if ( Timercount >= 0) { //Если таймер ещё идёт, то
TextView countview = (TextView)getActivity().findViewById(R.id.displaycount); //Объявляю TextView
countview.setText(Timercount); //Пишу время таймера
} else { //Если время таймера подошло к концу
if (MyTimer != null) {MyTimer.cancel();} //Останавливаем таймер, если он идёт
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
TextView countview = (TextView)getActivity().findViewById(R.id.displaycount); //Объявляю TextView
countview.setText("Время вышло"); //Пишу "Время вышло"
}
});
}
}
}
}
Проблема в том, что приложение попросту не запускается. Я выяснил, что причиной вылетов приложения является установка onClickListener для кнопки в PageFragment. Но как обойтись без onClickListener не могу понять.
Надеюсь расписал понятно. Рассчитываю на вашу помощь.
Button buttonStart = (Button)getActivity().findViewById(R.id.btn_start);
тут вы ищете кнопку в разметке активити, а она у вас, как я понял, во фрагменте. Значит и искать её нужно в разметке фрагмента:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//Для того, чтобы было написано какой это фрагмент
View result=inflater.inflate(R.layout.fragment_page, container, false);
//Расписываю кнопку
Button buttonStart = (Button)result.findViewById(R.id.btn_start);
//Устанавливаю Listener для кнопки
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
});
...
//Возвращаю result (Не знаю зачем, но так было в образце)
return result;
}
И советую вам почитать теорию/документацию, а то у вас много комментариев типа "Не знаю для чего, но делаю..."
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Вообщем есть приложение которое состоит из одного Activity и множества FragmentВ проекте используется MVP библиотека Moxy
Делаю небольшой калькулятор, и при тестировании заметил, что, например, при перемножении 5000 и 5000, получаю не 25000
У меня задача - уложить в какой-либо контейнер 30-ти значное число, что уже по определению больше чем LongMAX, которое всего 19-ти разрядное
Вопрос такойБыла одна прилага состоящая из нескольких jar файлов