我正在创建一个显示区域交通方式的应用,它有一个只有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: 验证
答案 0 :(得分:1)
出现此错误的原因是FragmentPagerAdapter
没有同步加载片段。此时,您正在调用setOnClickListener
,因为尚未调用该片段的onCreateView
,所以按钮引用为空。
此外,您正在实例化活动中的一个片段并维护对其按钮之一的引用,但是适配器的getItem
方法实际上创建了该片段的另一个实例,这意味着您在活动中创建的片段是没用过。
与其在活动中设置OnClickListener
,不如直接在onCreateView
中的片段中进行设置。这样,您就可以访问该片段中的所有其他内容。相反,如果在点击按钮时需要访问活动中的某些内容,则可以调用((MainActivity) getActivity()).myCustomFunction();
并在myCustomFunction()
中编写其余代码,您可以在其中访问MainActivity中的其他所有内容。 / p>