Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将局部值指定给全局值_Java_Android - Fatal编程技术网

Java 无法将局部值指定给全局值

Java 无法将局部值指定给全局值,java,android,Java,Android,我只是java/android的初学者。我试图将位置纬度和经度传递给firebase。所以我烤了一下消息,看看它显示的值是0.0。我将lat和long值从client.getlastlocation传递到lat和lon的全局值,但它显示的是默认值0.0,为什么会发生这种情况 public class shopaction extends Fragment implements CompoundButton.OnCheckedChangeListener{ private static fina

我只是java/android的初学者。我试图将位置纬度和经度传递给firebase。所以我烤了一下消息,看看它显示的值是0.0。我将lat和long值从client.getlastlocation传递到lat和lon的全局值,但它显示的是默认值0.0,为什么会发生这种情况

public class shopaction extends Fragment implements CompoundButton.OnCheckedChangeListener{

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
Location location;
GoogleApiClient googleApiClient;
FusedLocationProviderClient client;
private String mParam1;
private String mParam2;
String s;
Switch action;
public double lat,lon;
private OnFragmentInteractionListener mListener;

public shopaction() {
}
public static shopaction newInstance(String param1, String param2) {
    shopaction fragment = new shopaction();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_shopaction, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    action = (Switch) view.findViewById(R.id.action);
    action.setOnCheckedChangeListener(this);
    client = LocationServices.getFusedLocationProviderClient(getActivity());
    Button button=(Button)view.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);

            }
            client.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    lat=location.getLatitude();
                    lon=location.getLongitude();
                }
            });


        }
    });
    client.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            lat=location.getLatitude();
            lon=location.getLongitude();
        }
    });
    Toast.makeText(getActivity(),lat+"",Toast.LENGTH_LONG).show();

    FirebaseDatabase  firebaseDatabase=FirebaseDatabase.getInstance();
    DatabaseReference databaseReference=firebaseDatabase.getReference();
    databaseReference.child("shop").child("location").setValue(lat);
}
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(action.isChecked())
    {
        Toast.makeText(getActivity(),"Your shop is open",Toast.LENGTH_LONG).show();
        action.setText("open");
        s="open";
    }
    else
    {
        Toast.makeText(getActivity(),"Your shop is closed",Toast.LENGTH_LONG).show();
        action.setText("close");
        s="close";
    }

}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}
公共类shopaction扩展片段实现CompoundButton.OnCheckedChangeListener{
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私有静态最终字符串ARG_PARAM2=“PARAM2”;
位置;
GoogleapClient GoogleapClient;
FusedLocationProviderClient客户端;
私有字符串mParam1;
私有字符串mParam2;
字符串s;
开关动作;
公共双lat,lon;
私有OnFragmentInteractionListener mListener;
公众行动{
}
公共静态shopaction newInstance(字符串param1,字符串param2){
shopaction片段=新shopaction();
Bundle args=新Bundle();
args.putString(ARG_PARAM1,PARAM1);
args.putString(ARG_PARAM2,PARAM2);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
返回充气机。充气(R.layout.fragment\u shopaction,容器,假);
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
action=(Switch)view.findViewById(R.id.action);
action.setOnCheckedChangeListener(此);
client=LocationServices.getFusedLocationProviderClient(getActivity());
Button Button=(Button)view.findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions(getActivity(),新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},1);
}
client.getLastLocation().addOnSuccessListener(getActivity(),new OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
lat=位置。getLatitude();
lon=location.getLongitude();
}
});
}
});
client.getLastLocation().addOnSuccessListener(getActivity(),new OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
lat=位置。getLatitude();
lon=location.getLongitude();
}
});
Toast.makeText(getActivity(),lat+“”,Toast.LENGTH_LONG).show();
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference DatabaseReference=firebaseDatabase.getReference();
databaseReference.child(“店铺”).child(“位置”).setValue(lat);
}
public void onButtonPressed(Uri){
if(mListener!=null){
onFragmentInteraction(uri);
}
}
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
if(OnFragmentInteractionListener的上下文实例){
mListener=(OnFragmentInteractionListener)上下文;
}否则{
抛出新的RuntimeException(context.toString()
+“必须实现OnFragmentInteractionListener”);
}
}
@凌驾
公共无效连接(){
super.onDetach();
mListener=null;
}
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
if(action.isChecked())
{
Toast.makeText(getActivity(),“您的店铺已营业”,Toast.LENGTH_LONG.show();
action.setText(“打开”);
s=“打开”;
}
其他的
{
Toast.makeText(getActivity(),“您的店铺关门了”,Toast.LENGTH_LONG.show();
action.setText(“关闭”);
s=“关闭”;
}
}
FragmentInteractionListener上的公共接口{
//TODO:更新参数类型和名称
void onFragmentInteraction(Uri);
}

}

问题在于
getLastLocation()
返回一个
任务
,然后该任务异步运行。在实际调用成功侦听器回调之前,位置数据不可用。同时,您的代码继续使用
lat
lon
的当前(默认)值0显示
Toast

解决此问题的一种方法是让成功侦听器回调显示toast,而不是主代码。因此,与此相反:

client.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {
        lat=location.getLatitude();
        lon=location.getLongitude();
    }
});
Toast.makeText(getActivity(),lat+"",Toast.LENGTH_LONG).show();

// Firebase update code that depends on location data
client.getLastLocation().addOnSuccessListener(getActivity(),new OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
lat=位置。getLatitude();
lon=location.getLongitude();
}
});
Toast.makeText(getActivity(),lat+“”,Toast.LENGTH_LONG).show();
//取决于位置数据的Firebase更新代码
使用以下命令:

client.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {
        lat=location.getLatitude();
        lon=location.getLongitude();
        Toast.makeText(getActivity(),lat+"",Toast.LENGTH_LONG).show();

        // Firebase update code that depends on location data
    }
});
client.getLastLocation().addOnSuccessListener(getActivity(),new OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
lat=位置。getLatitude();
lon=location.getLongitude();
Toast.makeText(getActivity(),lat+“”,Toast.LENGTH_LONG).show();
//取决于位置数据的Firebase更新代码
}
});

在使用
location.getLatitude()之前,您在哪里为位置赋值?这显示了正确的纬度和经度,但为什么它没有传递到全局variable@Akishere-是的。它只是异步地做。这是其中一个di