Невозможно накачать повторяющийся фрагмент (com.google.android.gms.location.places.ui.PlaceAutocompleteFragment) - PullRequest
0 голосов
/ 23 мая 2019

Ошибка надувания фрагмента класса. Дублирующийся идентификатор 0x7f0901b7, нулевой тег или родительский идентификатор 0xffffffff с другим фрагментом для com.google.android.gms.location.places.ui.PlaceAutocompleteFragment

Это учебное пособие, которым я былработа над.Я не вижу, чтобы найти решение

public class Cart extends AppCompatActivity implements 
GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
LocationListener,RecyclerItemTouchHelperListener {

private static final int PAYPAL_REQUEST_CODE = 9999;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference requests;

public TextView txtTotalPrice;
Button btnPlace;
List<Order> cart = new ArrayList<>();
CartAdapter adapter;

APIService mService;

RelativeLayout rootLayout;

Place shippingaddress;

static  PayPalConfiguration config = new PayPalConfiguration()
        .environment(PayPalConfiguration.ENVIRONMENT_SANDBOX)
        .clientId(Config.PAYPAL_CLIENT_ID);

String address,comment;

private LocationRequest mLocationRequest;
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
private static final int UPDATE_INTERVAL = 5000;
private static final int FASTEST_INTERVAL = 3000;
private static final int DISPLACEMENT = 10;
private static final int LOCATION_REQUEST_CODE = 9999;
private static final int PLAY_SERVICES_REQUEST = 9997;

IGoogleService mGoogleMapService;

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

    mGoogleMapService = Common.getGoogleMapAPI();

    rootLayout = (RelativeLayout)findViewById(R.id.rootLayout);

    if (ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(this,new String[]
                {
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION

                }, LOCATION_REQUEST_CODE);
    }
    else {
        if (checkPlayServices())
        {
            buildGoogleApiClient();
            createLocationRequest();
        }
    }

    Intent intent = new Intent(this, PayPalService.class);
    intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION,config);
    startService(intent);

    mService = Common.getFCMService();

    database = FirebaseDatabase.getInstance();
    requests = database.getReference("Restaurants").
 child(Common.restaurantSelected).child("Requests");

    recyclerView = (RecyclerView)findViewById(R.id.listCart);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new 
  RecyclerItemTouchHelper(0,ItemTouchHelper.LEFT, this);
    new  
 ItemTouchHelper(itemTouchHelperCallback)
.attachToRecyclerView(recyclerView);

    txtTotalPrice = (TextView)findViewById(R.id.total);
    btnPlace = (Button)findViewById(R.id.btnPlaceOrder);

    btnPlace.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showAlertDialog();

            }
    });
    if (cart.size() > 0)
        showAlertDialog();
    else
        Toast.makeText(Cart.this,"Your cart is empty", 
Toast.LENGTH_SHORT).show();

    loadListFood();

}

 private void createLocationRequest() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setSmallestDisplacement(DISPLACEMENT);

    }

 private synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API).build();

    mGoogleApiClient.connect();
 }

private boolean checkPlayServices() {
    int resultCode = 
GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS){
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode))
            GooglePlayServicesUtil.
getErrorDialog(resultCode,this,PLAY_SERVICES_REQUEST).show();

        else {
            Toast.makeText(this,"This device does not support location 
services",Toast.LENGTH_SHORT).show();
            finish();
        }
        return false;
    }
    return true;

}

private void showAlertDialog() {

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this);
    alertDialog.setTitle("One more step");
    alertDialog.setMessage("Enter your address:");

    LayoutInflater inflater = this.getLayoutInflater();
    View order_address_comment = 
inflater.inflate(R.layout.order_address_comment, null);

    final PlaceAutocompleteFragment edtAddress = 
(PlaceAutocompleteFragment) 
getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);


edtAddress.getView().findViewById(R.id.place_autocomplete_search_button)
.setVisibility(View.GONE);
    ((EditText) 
edtAddress.getView().findViewById(R.id.place_autocomplete_search_input))
            .setHint("Enter your address");
    ((EditText) 
edtAddress.getView().findViewById(R.id.place_autocomplete_search_input))
            .setTextSize(14);

    edtAddress.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {

            shippingaddress = place;
        }

        @Override
        public void onError(Status status) {

            Log.e("ERROR", status.getStatusMessage());
        }
    });

    final EditText edtComment = (EditText) 
order_address_comment.findViewById(R.id.edtComment);

    final RadioButton rdiShipToAddress = (RadioButton) 
order_address_comment.findViewById(R.id.rdiShipToAddress);
    final RadioButton rdiHomeAddress = (RadioButton) 
order_address_comment.findViewById(R.id.rdiHomeAddress);
    final RadioButton rdiCOD = (RadioButton) 
order_address_comment.findViewById(R.id.rdiCOD);
    final RadioButton rdiPaypal = (RadioButton) 
order_address_comment.findViewById(R.id.rdiPayPal);
    final RadioButton rdiBalance = (RadioButton) 
order_address_comment.findViewById(R.id.rdiEatItBalance);

    rdiHomeAddress.setOnCheckedChangeListener(new 
CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, 
boolean b) {
            if (b) {
              if (Common.currentUser.getHomeAddress() != null ||

!TextUtils.isEmpty(Common.currentUser.getHomeAddress()))
              {
                  address = Common.currentUser.getHomeAddress();
                  ((EditText) 
edtAddress.getView().findViewById(R.id.place_autocomplete_search_input))
                          .setText(address);
              }

                else 
              {
                  Toast.makeText(Cart.this, "Please update your home 
address", Toast.LENGTH_SHORT).show();
              }
            }
        }
    });

    rdiShipToAddress.setOnCheckedChangeListener(new 
CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, 
boolean b) {
            if (b) {

mGoogleMapService.getAddressName
(String.format("https://maps.googleapis.com/maps/api/geocode/json? 
latlng=%f,%f&sensor=false",
                        mLastLocation.getLatitude(),
                        mLastLocation.getLongitude()))
                        .enqueue(new Callback<String>() {
                            @Override
                            public void onResponse(Call<String> call, 
Response<String> response) {

                                try {
                                    JSONObject jsonObject = new 
JSONObject(response.body().toString());
                                    JSONArray resultsArray = 
jsonObject.getJSONArray("results");

                                    JSONObject firstObject = 
resultsArray.getJSONObject(0);

                                    address = 
firstObject.getString("formatted_address");

                                    ((EditText) 
edtAddress.getView().findViewById(R.id.place_autocomplete_search_input))
                                            .setText(address);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }

                            @Override
                            public void onFailure(Call<String> call, 
Throwable t) {
                                Toast.makeText(Cart.this, "" + 
t.getMessage(), Toast.LENGTH_SHORT).show();

                            }
                        });

            }
        }
    });

    alertDialog.setView(order_address_comment);
    alertDialog.setIcon(R.drawable.ic_shopping_cart_black_24dp);
    alertDialog.setPositiveButton("Yes", new 
DialogInterface.OnClickListener() {


        @Override
        public void onClick(DialogInterface dialogInterface, int i) {


            if (!rdiShipToAddress.isChecked() && 
!rdiHomeAddress.isChecked()) {
                if (shippingaddress != null)
                    address = shippingaddress.getAddress().toString();
                else {
                    Toast.makeText(Cart.this, "Please enter address or 
select address option", Toast.LENGTH_SHORT).show();
                    getFragmentManager().beginTransaction()

.remove(getFragmentManager()
.findFragmentById(R.id.place_autocomplete_fragment))
                            .commit();

                    return;
                }
            }

            if (!TextUtils.isEmpty(address)) {
                Toast.makeText(Cart.this, "Please enter address or select 
address option", Toast.LENGTH_SHORT).show();
                getFragmentManager().beginTransaction()

.remove(getFragmentManager()
.findFragmentById(R.id.place_autocomplete_fragment))
                        .commit();

                return;

            }
            comment = edtComment.getText().toString();

            if (!rdiCOD.isChecked() && !rdiCOD.isChecked() && 
!rdiBalance.isChecked()) {
                Toast.makeText(Cart.this, "Please select from payment 
options", Toast.LENGTH_SHORT).show();
                getFragmentManager().beginTransaction()

.remove(getFragmentManager()
.findFragmentById(R.id.place_autocomplete_fragment))
                        .commit();

                return;

            } else if (rdiPaypal.isChecked()) {

                String formatAmount = txtTotalPrice.getText().toString()
                        .replace("$", "")
                        .replace(",", "");

                PayPalPayment payPalPayment = new PayPalPayment(new 
BigDecimal(formatAmount),
                        "USD",
                        "Food4Thought App Order",
                        PayPalPayment.PAYMENT_INTENT_SALE);
                Intent intent = new Intent(getApplicationContext(), 
PaymentActivity.class);
                intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, 
config);
                intent.putExtra(PaymentActivity.EXTRA_PAYMENT, 
payPalPayment);
                startActivityForResult(intent, PAYPAL_REQUEST_CODE);

                getFragmentManager().beginTransaction()

.remove(getFragmentManager()
.findFragmentById(R.id.place_autocomplete_fragment))
                        .commit();

            }
            else if
                    (rdiCOD.isChecked())
            {
                Request request = new Request(
                        Common.currentUser.getPhone(),
                        Common.currentUser.getName(),
                        address,
                        txtTotalPrice.getText().toString(),
                        "0",
                        comment,
                        "COD",
                        "Unpaid",

String.format("%s,%s",mLastLocation.getLatitude()
,mLastLocation.getLongitude()),
                        Common.restaurantSelected,
                        cart
                );

                String order_number = 
String.valueOf(System.currentTimeMillis());
                requests.child(order_number)
                        .setValue(request);

                new 
Database(getBaseContext()).cleanCart(Common.currentUser.getPhone());

                sendNotificationOrder(order_number);

                }
                else if (rdiBalance.isChecked())
                {
                    double amount = 0;
                    try {
                        amount = 
Common.formatCurrency(txtTotalPrice.getText().toString(),Locale.US)
.doubleValue();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    if (Common.currentUser.getBalance() >= amount){
                        Request request = new Request(
                                Common.currentUser.getPhone(),
                                Common.currentUser.getName(),
                                address,
                                txtTotalPrice.getText().toString(),
                                "0",
                                comment,
                                "Balance",
                                "Paid",

String.format("%s,%s",mLastLocation.getLatitude()
,mLastLocation.getLongitude()),
                                Common.restaurantSelected,
                                cart);

                        final String order_number = 
String.valueOf(System.currentTimeMillis());
                        requests.child(order_number)
                                .setValue(request);

                        new 
Database(getBaseContext()).cleanCart(Common.currentUser.getPhone());

                       double balance = Common.currentUser.getBalance() - 
amount;
                        Map<String, Object> update_balance = new HashMap<> 
();
                        update_balance.put("balance",balance);

                        FirebaseDatabase.getInstance()
                                .getReference("User")
                                .child(Common.currentUser.getPhone())
                                .updateChildren(update_balance)
                                .addOnCompleteListener(new 
OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull 
Task<Void> task) {
                                        if (task.isSuccessful())
                                        {
                                            FirebaseDatabase.getInstance()
                                                    .getReference("User")

.child(Common.currentUser.getPhone())

.addListenerForSingleValueEvent(new ValueEventListener() {
                                                        @Override
                                                        public void 
onDataChange(@NonNull DataSnapshot dataSnapshot) {

Common.currentUser = dataSnapshot.getValue(User.class);


sendNotificationOrder(order_number);
                                                        }

                                                        @Override
                                                        public void 
onCancelled(@NonNull DatabaseError databaseError) {

                                                        }
                                                    });
                                        }

                                    }
                                });

                    }
                    else
                        {
                            Toast.makeText(Cart.this, "Your balance is not 
enough please choose another payment method", Toast.LENGTH_SHORT).show();
                    }
                }


            getFragmentManager().beginTransaction()

.remove(getFragmentManager()
.findFragmentById(R.id.place_autocomplete_fragment))
                    .commit();
        }


    });
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, 
grantResults);
    switch(requestCode){
        case LOCATION_REQUEST_CODE:{
            if (grantResults.length >0&& grantResults[0] == 
PackageManager.PERMISSION_GRANTED){
            }
            if (checkPlayServices())
            {
                buildGoogleApiClient();
                createLocationRequest();
            }

        }
        break;

    }
 }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
data) {
    if (requestCode == PAYPAL_REQUEST_CODE){


        if (resultCode == RESULT_OK){
            PaymentConfirmation confirmation = 
data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
            if (confirmation != null){
                try {
                    String paymentDetail = 
confirmation.toJSONObject().toString(4);
                    JSONObject jsonObject = new JSONObject(paymentDetail);


            Request request = new Request(
                    Common.currentUser.getPhone(),
                    Common.currentUser.getName(),
                    address,
                    txtTotalPrice.getText().toString(),
                    "0",
                    comment,
                    "Paypal",

jsonObject.getJSONObject("response").getString("state"),

String.format("%s,%s",shippingaddress.getLatLng()
.latitude,shippingaddress.getLatLng().longitude,shippingaddress),
                    Common.restaurantSelected,
                    cart
            );
            String order_number = 
String.valueOf(System.currentTimeMillis());
            requests.child(order_number)
                    .setValue(request);

            new 
Database(getBaseContext()).cleanCart(Common.currentUser.getPhone());

            sendNotificationOrder(order_number);

            Toast.makeText(Cart.this,"Thank you for your 
order",Toast.LENGTH_SHORT).show();
            finish();


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Toast.makeText(this,"Payment 
canceled",Toast.LENGTH_SHORT).show();
        else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID)
            Toast.makeText(this,"Invalid 
payment",Toast.LENGTH_SHORT).show();
    }
}


private void sendNotificationOrder(final String order_number) {
    DatabaseReference tokens = 
FirebaseDatabase.getInstance().getReference("Tokens");
    Query data = tokens.orderByChild("is ServerToken").equalTo(true);
    data.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot postSnapShot:dataSnapshot.getChildren()){
                Token serverToken = postSnapShot.getValue(Token.class);

               // Notification notification = new Notification("Food for 
Thought","You have new order"+order_number);
               // Sender content = new 
Sender(serverToken.getToken(),notification);

                Map<String,String>dataSend = new HashMap<>();
                dataSend.put("title","Food for Thought");
                dataSend.put("message","You have a new order" + 
order_number);
                DataMessage dataMessage = new 
DataMessage(serverToken.getToken(),dataSend);

                String test = new Gson().toJson(dataMessage);
                Log.d("Content",test);



                mService.sendNotification(dataMessage)
                        .enqueue(new Callback<MyResponse>() {
                            @Override
                            public void onResponse(Call<MyResponse> call, 
Response<MyResponse> response) {

                                if (response.code()== 200) {
                                    if (response.body().success == 1) {
                                        Toast.makeText(Cart.this, "Thank 
you for your order", Toast.LENGTH_SHORT).show();
                                        finish();

                                    } else {
                                        Toast.makeText(Cart.this, 
"Failed", Toast.LENGTH_SHORT).show();

                                    }
                                }


                            }

                            @Override
                            public void onFailure(Call<MyResponse> call, 
Throwable t) {
                                Log.e("ERROR", t.getMessage());

                            }
                        });
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

 }

private void loadListFood() {
    cart = new Database (this).getCarts(Common.currentUser.getPhone());
    adapter = new CartAdapter(cart,this);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);

    int total = 0;
    for (Order order:cart)
        total+=(Integer.parseInt(order.getPrice()))* 
(Integer.parseInt(order.getQuantity()));
    Locale locale= new Locale("en","US");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
    txtTotalPrice.setText(fmt.format(total));

}

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getTitle().equals(Common.DELETE))
        deleteCart(item.getOrder());
    return true;
}

private void deleteCart(int position) {
    cart.remove(position);
    new Database(this).cleanCart(Common.currentUser.getPhone());
    for (Order item : cart)
        new Database(this).addToCart(item);

    loadListFood();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    displayLocation();
    startLocationUpdates();

}

private void startLocationUpdates() {
    if (ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED)
    {
        return;
    }

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
mLocationRequest,this);
}

private void displayLocation() {
    if (ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_COARSE_LOCATION) != 
PackageManager.PERMISSION_GRANTED)
    {
        return;
    }
   mLastLocation = 
LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null){
        Log.d("LOCATION", "Your location : "+mLastLocation.getLatitude()+ 
","+mLastLocation.getLongitude());
    }
    else {
        Log.d("LOCATION", "Could not get your location");
    }
}

@Override
public void onConnectionSuspended(int i) {
    mGoogleApiClient.connect();

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 
{

}

@Override
public void onLocationChanged(Location location) {
    mLastLocation = location;
    displayLocation();

}


@Override
public void onSwipe(RecyclerView.ViewHolder viewHolder, int direction, int 
position) {
    if (viewHolder instanceof CartViewHolder){
        String name = ((CartAdapter)recyclerView.getAdapter())
.getItem(viewHolder.getAdapterPosition()).getProductName();

        final Order deleteItem = 
((CartAdapter)recyclerView.getAdapter())
.getItem(viewHolder.getAdapterPosition());
        final int deleteIndex = viewHolder.getAdapterPosition();

        adapter.removeItem(deleteIndex);
       new 
Database(getBaseContext()).removeFromCart(deleteItem.getProductId()
,Common.currentUser.getPhone());

        int total = 0;
        List<Order> orders = new 
Database(getBaseContext()).getCarts(Common.currentUser.getPhone());
        for (Order item : orders)
            total += (Integer.parseInt(item.getPrice())) * 
(Integer.parseInt(item.getQuantity()));
        Locale locale = new Locale("en", "US");
        NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
        txtTotalPrice.setText(fmt.format(total));

        Snackbar snackbar = Snackbar.make(rootLayout, name + "removed from 
cart",Snackbar.LENGTH_LONG);
        snackbar.setAction("UNDO", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.restoreItem(deleteItem,deleteIndex);
                new Database(getBaseContext()).addToCart(deleteItem);

                int total = 0;
                List<Order> orders = new 
Database(getBaseContext()).getCarts(Common.currentUser.getPhone());
                for (Order item : orders)
                    total += (Integer.parseInt(item.getPrice())) * 
(Integer.parseInt(item.getQuantity()));
                Locale locale = new Locale("en", "US");
                NumberFormat fmt = 
NumberFormat.getCurrencyInstance(locale);
                txtTotalPrice.setText(fmt.format(total));

            }
        });
        snackbar.setActionTextColor(Color.RED);
        snackbar.show();


    }

}
}

logcat. Причина: android.view.InflateException: строка двоичного файла XML # 24: ошибка надувания фрагмента класса. Причина: java.lang.IllegalArgumentException: двоичный XMLСтрока файла # 24: Дублирующийся идентификатор 0x7f0901b7, нулевой тег или родительский идентификатор 0xffffffff с другим фрагментом для com.google.android.gms.location.places.ui.PlaceAutocompleteFragment

...