我如何在MainActivity的片段中使用按钮或在片段中的活动中使用gmap小部件?

时间:2018-08-30 08:46:02

标签: android android-fragments onclicklistener

我正在创建一个显示区域交通方式的应用,它有一个只有3个页面的3页ViewPager(我不想为我目前拥有的所有3种交通方式都创建很多碎片) ,但是我的问题是我想访问MainActivity上的fragments按钮,以便单击该按钮时,它会调用MainActivity中的GoogleMap对象,并且我可以显示标记,甚至可以访问片段中的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:尝试调用虚拟   方法“无效”   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 :(得分:1)

出现此错误的原因是FragmentPagerAdapter没有同步加载片段。此时,您正在调用setOnClickListener,因为尚未调用该片段的onCreateView,所以按钮引用为空。

此外,您正在实例化活动中的一个片段并维护对其按钮之一的引用,但是适配器的getItem方法实际上创建了该片段的另一个实例,这意味着您在活动中创建的片段是没用过。

与其在活动中设置OnClickListener,不如直接在onCreateView中的片段中进行设置。这样,您就可以访问该片段中的所有其他内容。相反,如果在点击按钮时需要访问活动中的某些内容,则可以调用((MainActivity) getActivity()).myCustomFunction();并在myCustomFunction()中编写其余代码,您可以在其中访问MainActivity中的其他所有内容。 / p>