Java Android откройте Снэк-бар после нажатия на маркер - PullRequest
0 голосов
/ 03 апреля 2019

enter image description here Я хочу открыть снэк-бар, после чего я нажал на маркер и попытался сделать это:

  gMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                for(PGO pgo : pgoList.pgos){
                    if(pgo.getFull().equalsIgnoreCase(marker.getTitle())){
                        currentPGO = pgo;
                        view = getCurrentFocus();
                        mySnackbar(pgo,view);
                    }
                }
                return false;
            }
        });





 public void mySnackbar(PGO pgo, View view) {
        LinearLayout.LayoutParams objLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        Snackbar snackbar = Snackbar.make(view, "", Snackbar.LENGTH_INDEFINITE);
        Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
        layout.setPadding(0, 0, 0, 0);
        LayoutInflater mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View snackView = getLayoutInflater().inflate(R.layout.my_snackbar, null);
        Button textViewOne = (Button) snackView.findViewById(R.id.txtOne);
        TextView tvName = (TextView) snackView.findViewById(R.id.name);
        tvName.setText(pgo.getFull());

        textViewOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("One", "First one is clicked");
                snackbar.dismiss();
            }
        });

        Button textViewTwo = (Button) snackView.findViewById(R.id.txtTwo);
        textViewTwo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("Two", "Second one is clicked");


            }
        });

        layout.addView(snackView, objLayoutParams);
        snackbar.show();
    }

Но мое приложение не работает, и в журнале я вижу:

java.lang.IllegalArgumentException: не найдено подходящего родителя из данный взгляд. Пожалуйста, предоставьте действительный вид.

Хорошо, я делаю это, и это работает:

getWindow().getDecorView(),

Но теперь, когда показывают Snackbar Я хочу увидеть всю карту, эта Snackbar покрывает мою карту

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

попробуйте

Используйте эту функцию, чтобы показать сообщение.

 public void showMessage(Activity context, String message) {

       Snackbar snackbar = Snackbar.make(context.getWindow().getDecorView().findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG);
        View snackBarView = snackbar.getView();
        snackBarView.setBackgroundColor(context.getResources().getColor(R.color.colorPrimary));
        TextView textView = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
        textView.setTextColor(context.getResources().getColor(R.color.white));
        snackbar.show();
    }

Для вашего использованияCase

gMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                for(PGO pgo : pgoList.pgos){
                    if(pgo.getFull().equalsIgnoreCase(marker.getTitle())){
                        currentPGO = pgo;
                       showMessage(MainActivity.this,pgo.getFull());
                    }
                }
                return false;
            }
        });
0 голосов
/ 03 апреля 2019

Я создал пользовательскую снэк-бар, где представления обернуты в CoordinatorLayout для фрагмента.

 @Override
public boolean onMarkerClick(Marker marker) {

        if (marker.getTag() != null) {
            marker.showInfoWindow();
            int tag = (int) marker.getTag();
            showCustomSnackBar(marker, 10000, tag);
        }

    return false;



   private void showCustomSnackBar(Marker marker,  int duration, int tag) {
    if (getActivity() != null && !(getActivity()).isFinishing()) { 
        CoordinatorLayout rootCoordinatorLayout = view.findViewById(R.id.parent_coordinator_layout);
        Snackbar snackbar = Snackbar.make(rootCoordinatorLayout, "", duration);
        Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
        layout.setBackgroundColor(getResources().getColor(R.color.white));

        LayoutInflater objLayoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View snackView = objLayoutInflater.inflate(R.layout.snackbar_layout_view, null);

        ImageView someImgView = snackView.findViewById(R.id.someImageView);

        TextView sometxt = snackView.findViewById(R.id.snackbar_msg);

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

                snackbar.dismiss();
            }
        });

        layout.addView(snackView, 0);
        snackbar.show();
    }
  }
}
0 голосов
/ 03 апреля 2019

Если у вас нет вида в фокусе, вы можете использовать Android по умолчанию следующим образом:

view = findViewById(android.R.id.content);
...