как обновить ProgressBar во фрагменте из активити?

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Закрыто
j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

как обновить ProgressBar во фрагменте из активити?

Сообщение j-test » 24 ноя 2015, 00:49

в активити есть два фрагмента, подключенных через <fragment> (вебвью и кнопки), во фрагменте с кнопками к тому же есть прогресс бар

Код: Выделить всё

<ProgressBar
                android:id="@+id/progressBar"
                style="?android:attr/progressBarStyleHorizontal"
                android:visibility="visible"
                android:layout_width="match_parent"
                android:layout_height="11dp"
                android:layout_gravity="center_horizontal"
                android:background="@color/colorProgressBar" />
В общем случае, в активити будет класс-менеджер который показывает задачку в одном фрагменте, варианты ответов в другом, и запускает таймер.
вот этот таймер сделал через AsyncTask (в который еще передается сколько секунд ему тикать). Ради теста класс сделал прям в активити.

Код: Выделить всё

public class SessionTimer extends AsyncTask<Integer,Integer,Integer>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Integer doInBackground(Integer... params) {
            int i;
            for(i=params[0];i!=0;i--)
            {
                publishProgress(i);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return i;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Toast.makeText(getApplicationContext(),"SEC: "+values[0], Toast.LENGTH_SHORT).show();
            //keyboard.SetProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
в активити перед этим есть 2 фрагмента

Код: Выделить всё

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.train_activity);
        setUI();
        SessionTimer sessionTimer = new SessionTimer();
        keyboard.SetMax(7);
        sessionTimer.execute(7);
    }

    public void setUI()
    {
        Toast.makeText(this,"ShowTrain", LENGTH_SHORT).show();
        mathjax = new MathJaxFragment();
        keyboard = new KeyboardFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.train_fragment_one, mathjax);
        fragmentTransaction.add(R.id.train_fragment_two, keyboard);
        //fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
НО!

при попытке что-то изменить в прогресс-баре фрагмента из активити - NullPointException.
Пробовал во фрагменте сделать открытые методы

Код: Выделить всё

public class KeyboardFragment extends android.support.v4.app.Fragment {

    ProgressBar progressBar;

    public void SetProgress(int i)
    {
        progressBar.setProgress(i);
    }

    public void SetMax(int i)
    {
        progressBar.setMax(i);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.keyboard_fragment,container,false);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
        progressBar.setVisibility(ProgressBar.VISIBLE);
        progressBar.setMax(10);
        return v;
    }
}
не помогло.
в активити через

Код: Выделить всё

progressBar = (ProgressBar) keyboard.getView().findViewById(R.id.progressBar);
то же NullPoint.

в чем проблема? собственно, понятно что проблема в том что View этого нет когда в активити пытаюсь вызвать методы прогресс бара (наверно), а почему его нет? и как это можно решить?

Realist
Сообщения: 134
Зарегистрирован: 08 фев 2014, 18:15

Re: как обновить ProgressBar во фрагменте из активити?

Сообщение Realist » 24 ноя 2015, 04:04

Отдебажьте, посмотрите, где именно null. Таймер не легче через Timer сделать? ProgressBar можно еще через BroadcastReceicer менять.

j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

Re: как обновить ProgressBar во фрагменте из активити?

Сообщение j-test » 24 ноя 2015, 12:40

Насколько я понял, Timer для запуска в определенное время, а мне нужно запустить таймер на несколько секунд чтобы в течении этого времени ответ от пользователя был получен или не получен.
пробовал сделать интерфейс

Код: Выделить всё

public class TrainActivity extends AppCompatActivity {
    android.support.v4.app.Fragment mathjax;
    KeyboardFragment keyboard=null;
    ProgressBar progressBar;
    onTimerUpdate timerUpdate;

    public interface onTimerUpdate
    {
        void SetProgress(int i);
        void SetMax(int i);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.train_activity);
        setUI();
        SessionTimer sessionTimer = new SessionTimer();
        sessionTimer.execute(7);
    }

    public void setUI()
    {
        Toast.makeText(this,"ShowTrain", LENGTH_SHORT).show();
        mathjax = new MathJaxFragment();
        keyboard = new KeyboardFragment();
        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.train_fragment_one, mathjax);
        fragmentTransaction.add(R.id.train_fragment_two, keyboard);
        //fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

    public class SessionTimer extends AsyncTask<Integer,Integer,Integer>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Integer doInBackground(Integer... params) {
            int i;
            for(i=params[0];i!=0;i--)
            {
                publishProgress(i);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return i;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Toast.makeText(getApplicationContext(),"SEC: "+values[0], Toast.LENGTH_SHORT).show();
            timerUpdate.SetProgress(values[0]);
            //keyboard.SetProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
}
вылетает на timerUpdate.SetProgress(values[0]);


//код фрагмента:

Код: Выделить всё

public class KeyboardFragment extends android.support.v4.app.Fragment implements TrainActivity.onTimerUpdate {

    ProgressBar progressBar;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.keyboard_fragment,container,false);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
        progressBar.setVisibility(ProgressBar.VISIBLE);
        progressBar.setMax(10);
        return v;
    }

    @Override
    public void SetProgress(int i) {
        progressBar.setProgress(i);
    }

    @Override
    public void SetMax(int i) {
        progressBar.setMax(i);
    }
}
причем когда я пытался из активити напрямую получить доступ к прогрессбару через findViewById android studio почему-то пишет подсказку что это может вызывать NPE...

j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

Re: как обновить ProgressBar во фрагменте из активити?

Сообщение j-test » 24 ноя 2015, 17:58

весь день потратил..... :x

ошибка была в xml.... в id/progressBar....

Закрыто