Передача значения переменной из activity в fragment

297
31 января 2018, 13:46

У меня есть BusActivity, в которой я уже знаю значение переменной position. У нее есть дочерний фрагмент BusStopFragment, который я создаю в методе SetupViewPager(). Вопрос состоит в том, как мне передать значение этой переменной position в метод setInitialData() этого фрагмента?

Код BusActivity:

public class BusActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bus);
    Intent intent = getIntent();
    int position;
    int DefaultValue = 0;
    position = intent.getIntExtra("EXTRA_POS", DefaultValue);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tablayout);
    tabLayout.setupWithViewPager(viewPager);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
    int id = item.getItemId();
    if(id == android.R.id.home){
        finish();
    }
    return super.onOptionsItemSelected(item);
}
private void setupViewPager(ViewPager viewPager){
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new BusStopFragment(), "BusStop");
    adapter.addFragment(new TableFragment(), "Table");
    adapter.addFragment(new MapFragment(), "Map");
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(adapter.getCount());
}
} 

Код BusStopFragment:

public class BusStopFragment extends Fragment {
private List<Station> stations = new ArrayList();
ListView stationsList;
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setInitialData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View view = inflater.inflate(R.layout.busstopfragment, container, false);
    stationsList = (ListView) view.findViewById(R.id.stationsList);
    Activity activity = new Activity();
    StationAdapter stationAdapter = new StationAdapter(getActivity().getApplicationContext(), R.layout.list_item, stations);
    stationsList.setAdapter(stationAdapter);
    return view;
}
private void setInitialData(){
    stations.add(new Station("01", "10 grn", R.drawable.ic_launcher_background));
    stations.add(new Station("02", "15 grn", R.drawable.ic_launcher_background));
    stations.add(new Station("03", "20 grn", R.drawable.ic_launcher_background));
}
}
Answer 1

Создайте интерфейс, который будет реализован вашим активити.

public interface Busable{
   int getPosition();

Добавьте наследование и реализуйте метод getPosition()

public class BusActivity extends AppCompatActivity implements Busable{
   public int getPosition(){
   return position; // position - перенесите на уровень класса
   }
}

Во фрагмент добавьте переменную

Busable mainActivity;

Переопределите метод onAttach(Activity activity)

onAttach(Activity activity){
  mainActivity = (Busable) activity;

И получите значение своей переменной

mainActivity.getPosition()
Answer 2

Создайте интерфейс ICallbacks

public interface ICallbacks {
    int getPosition();
}

Затем замените код в активности (имплементируйте этот интерфейс, реализуйте метод getPosition(), вынесите переменную position на уровень класса)

public class BusActivity extends AppCompatActivity implements ICallbacks {
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int position;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bus);
        Intent intent = getIntent();
        int DefaultValue = 0;
        position = intent.getIntExtra("EXTRA_POS", DefaultValue);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tablayout);
        tabLayout.setupWithViewPager(viewPager);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();
        if(id == android.R.id.home){
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
    private void setupViewPager(ViewPager viewPager){
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new BusStopFragment(), "BusStop");
        adapter.addFragment(new TableFragment(), "Table");
        adapter.addFragment(new MapFragment(), "Map");
        viewPager.setAdapter(adapter);
        viewPager.setOffscreenPageLimit(adapter.getCount());
    }
    @Override
    public int getPosition() {
        return position;
    }
} 

Затем измените код во фрагменте (создайте переменные ICallbacks ICallbacks, int position и переопределите метод onAttach)

public class BusStopFragment extends Fragment {
    private List<Station> stations = new ArrayList();
    ListView stationsList;
    private ICallbacks ICallbacks;
    private int position;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setInitialData();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view = inflater.inflate(R.layout.busstopfragment, container, false);
        stationsList = (ListView) view.findViewById(R.id.stationsList);
        Activity activity = new Activity();
        StationAdapter stationAdapter = new StationAdapter(getActivity().getApplicationContext(), R.layout.list_item, stations);
        stationsList.setAdapter(stationAdapter);
        return view;
    }
    private void setInitialData(){
        stations.add(new Station("01", "10 grn", R.drawable.ic_launcher_background));
        stations.add(new Station("02", "15 grn", R.drawable.ic_launcher_background));
        stations.add(new Station("03", "20 grn", R.drawable.ic_launcher_background));
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (!(context instanceof ICallbacks)) {
            throw new ClassCastException("Activity must implement fragment's ICallbacks.");
        }
        ICallbacks = (ICallbacks) context;
        position = ICallbacks.getPosition();
    }
}
READ ALSO
Ограничение длины пароля в Spring Security

Ограничение длины пароля в Spring Security

Делаю регистрацию юзераДлина пароля должна быть от 6 до 16 символов

266
Как сделать подпись у иконки в floating action button?

Как сделать подпись у иконки в floating action button?

У меня есть Floating Action Button с Vector Drawable внутриМожно ли под него вставить текст? (не рядом с кнопкой, а внутри нее, как на картинке)

211
Как определить причину исключения

Как определить причину исключения

Помогите, пожалуйста, определить причину исключенияУстанавливаю приложение на Centos7, которое работает с MySql

256
Placemark с button yandex

Placemark с button yandex

Подскажите пожалуйста как сделать такое: Открываешь Placemark в нем кнопка выбрать, после ее нажатия на странице нужно перезаписать значение...

492