Как я могу использовать кнопку в моем фрагменте на MainActivity или использовать виджет gmap из своей активности в моем фрагменте? - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение, которое показывает транспортные средства в области, у него есть 3-страничный ViewPager только с одним фрагментом (я не хотел создавать много фрагментов для всех 3 транспортных средств, которые у меня сейчас есть) , но моя проблема в том, что я хочу иметь доступ к кнопке фрагментов в MainActivity, чтобы при нажатии на нее вызывался объект GoogleMap, который находится в MainActivity, и я мог отображать маркеры или даже иметь доступ к объекту GoogleMap в моем фрагменте ( даже лучше) так что я могу манипулировать им так, как хочу, но любой код, который я пишу, дает мне нулевой указатель на кнопку.

Это основной класс:

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

        bottom_view_on_successful_pick_layout = findViewById(R.id.bottom_view_on_successful_pick_layout);

       GoogleApiClient = new GoogleApiClient
                .Builder(this)
                .addApi(Places.GEO_DATA_API)
                .addApi(Places.PLACE_DETECTION_API)
                .enableAutoManage(this, this)
                .build();

        autoCompleteAdapter = new PlaceAutocompleteAdapter(this, Places.getGeoDataClient(this, null), LAT_LNG_BOUNDS, null);



        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(MainActivity.this);


        RideOptionFragment rideOptionFragment =  RideOptionFragment.newInstance(new RideOption("cars", "1"));

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

        mapFragment.getMapAsync(MainActivity.this);

        ViewPager viewPager = findViewById(R.id.ride_option_ViewPager);

        rideOptionPageAdapter = new RideOptionPageAdapter(getSupportFragmentManager(),cc);

        viewPager.setAdapter(rideOptionPageAdapter);

        rideOptionFragment.rideRequestBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // do somthing to google map ere

            }
        });
    }

Это адаптер опции поездки:

public class RideOptionPageAdapter extends FragmentPagerAdapter {

    public int position = 0;



    public RideOption[] rideOptions = {

            new RideOption("car", "1"),
            new RideOption("biycle", "2"),
            new RideOption("boat", "3")


    };

    public RideOptionFragment rof;

    public RideOptionPageAdapter(FragmentManager fm, RideOptionFragment rr){
        super(fm);

        rof = rr;    
    }

    @Override
    public int getCount() {

        return rideOptions.length;
    }

    @Override
    public Fragment getItem(int position) {

        rof = RideOptionFragment.newInstance(rideOptions[position]);

        return  rof;

    }    
}

Это мой фрагмент:

RideOption rideOption = new RideOption("pullova", "pullova_");

    CircleImageView circleImageView;

публичная кнопка rideRequestBtn;

public static RideOptionFragment newInstance(RideOption rideOption) {

        RideOptionFragment rideOptionFragment = new RideOptionFragment();       
        rideOptionFragment.rideOption = rideOption;    
        return rideOptionFragment;
        }



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view  = inflater.inflate(R.layout.ride_option_layout, container, false);

        rideRequestBtn = view.findViewById(R.id.ride_request);

        circleImageView = view.findViewById(R.id.pullova_ride_option_image);
            circleImageView.setImageDrawable(getResources().getDrawable(getResources().getIdentifier(rideOption.getImage_URL(), "drawable", getActivity().getPackageName())));

        rideRequestBtn.setText(rideOption.getName());


        return view;

        }

Это ошибка, которую я получаю:

Причина: java.lang.NullPointerException: попытка вызвать виртуальную метод void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)» на нулевой ссылке на объект в com.pullova.pullovatechnologies.pullovaandroidproject.MainActivity.onCreate (MainActivity.java:228) на android.app.Activity.performCreate (Activity.java:6664) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1118) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2599) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2707) на android.app.ActivityThread.-wrap12 (ActivityThread.java) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1460) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread.java:6077) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755) W / art: Проверка

1 Ответ

0 голосов
/ 30 августа 2018

Причина, по которой вы получаете эту ошибку, заключается в том, что FragmentPagerAdapter не загружает фрагменты синхронно. В тот момент, когда вы звоните setOnClickListener, ссылка на кнопку равна нулю, поскольку onCreateView фрагмента еще не был вызван.

Кроме того, вы создаете экземпляр фрагмента в действии и сохраняете ссылку на одну из его кнопок, но метод getItem вашего адаптера фактически создает другой экземпляр фрагмента, что означает, что фрагмент, созданный в действии, никогда не используется. .

Вместо установки OnClickListener из действия, сделайте это прямо из фрагмента, в пределах onCreateView. Таким образом, у вас есть доступ ко всему остальному в этом фрагменте. Если вместо этого вам нужен доступ к чему-либо из действия при нажатии кнопки, вы можете позвонить ((MainActivity) getActivity()).myCustomFunction(); и написать остальную часть кода в myCustomFunction(), где у вас есть доступ ко всему остальному в MainActivity.

...