Как проверить, что пользователь щелкнул в диалоговом окне удаления, созданном с использованием намерения в android? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь создать приложение, способное удалять другие установленные приложения. Поэтому, когда я использую намерение удаления, открывается диалоговое окно с запросом ОК или отмены. Итак, как я могу узнать, выбрал ли пользователь ОК или Отменить, поскольку мне нужно скрыть нажатую кнопку удаления. Назначена как кнопка, присутствующая в publi c просмотрщик класса в конце кода

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>  {
MainActivity mainActivity=new MainActivity();
private Context mContext;
List<Drawable> images;
List<String> titles;
List<String> apps;
LayoutInflater inflater;

public void uninstallAPK(String apkPackageName) {
    Intent intent = new Intent(Intent.ACTION_DELETE);
    intent.setData(Uri.parse("package:" + apkPackageName));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
    mContext.startActivity(intent);
}

private void goToUrl (String url) {
    Uri uriUrl = Uri.parse(url);
    Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
    launchBrowser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    launchBrowser.putExtra(Intent.EXTRA_RETURN_RESULT, true);
    mContext.startActivity(launchBrowser);
    mainActivity.finish();
}


public Adapter(Context ctx, List<String> titles, List<Drawable> 
images,List<String> apps){
    this.titles =titles;
    this.images = images;
    this.apps = apps;
    this.inflater =LayoutInflater.from(ctx);
    mContext = ctx;
}



@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 
viewType) {
    View view = inflater.inflate(R.layout.custom_grid_layout,parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int 
position) {
    holder.title.setText(titles.get(position));
    holder.gridIcon.setImageDrawable(images.get(position));
}

@Override
public int getItemCount() {
    return titles.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    ImageView gridIcon;
    TextView title;
    Button button;
    Button button3;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.textView);
        gridIcon = itemView.findViewById(R.id.imageView2);
        button = itemView.findViewById(R.id.button);
        button3 = itemView.findViewById(R.id.button3);

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                uninstallAPK(apps.get(getAdapterPosition()));
                //want to hide the button if ok is pressed otherwise want 
                to show the button
            }


        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final ParseQuery<ParseObject> linkwa = new 
                ParseQuery<ParseObject>("package");
                linkwa.whereEqualTo("packid", 
                apps.get(getAdapterPosition()));
                linkwa.findInBackground(new FindCallback<ParseObject>() {
                    @Override
                    public void done(List<ParseObject> objects, 
                    ParseException e) {
                        if(e==null && objects.size()>0){
                            for (ParseObject object:objects){
                                goToUrl(object.getString("link"));
                            }
                        }
                    }
                });
            }
        });



    }
}

}

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

На самом деле существует обходной путь, который вы можете попробовать

  1. StartActivityFotResult, который гарантирует, что вы получите обратный вызов внутри onActivityResult

    public void uninstallAPK(String apkPackageName) {
         Intent intent = new Intent(Intent.ACTION_DELETE);
         intent.setData(Uri.parse("package:" + apkPackageName));
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
         mContext.startActivityForResult(intent, 12345);
    
     }
    
  2. Теперь вы можете проверить код результата, успешен он или нет RESULT_OK или RESULT_CANCELLED

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
    
     if (requestCode == 1234) {
         if(resultCode == Activity.RESULT_OK){
             //Deleted
         }
         if (resultCode == Activity.RESULT_CANCELED) {
             //Dismissed
         }
     }
    }//onActivityResult
    

2.1. Если вышеперечисленное решение не помогло, то

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1234) {
        if (appInstalledOrNot("required_app_package_name")){
           // Dismissed
        }else { 
           //Deleted
        }
    }
}//onActivityResult


private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

PS. Проверка, установлено приложение или нет, берется из здесь

0 голосов
/ 20 июня 2020

Не знаю, как ваша реализация, но в идеале я бы имел две кнопки. Один для отмены, другой для удаления. И я бы установил clicklistener на обе кнопки. Итак, всякий раз, когда onclickListener выполняется, это означает, что пользователь нажал кнопку диалогового окна. Итак, во-первых, я бы пропустил диалог, во-вторых, на основе кнопки, которую пользователь нажал

public void onClick(View v){
   if(v.getId == R.id.btn_dialog_uninstall){
      uninstallPackage("package_name");
      dialog.dissmiss();
   }else{
    dialog.dissmiss(); // user pressed cancelled;
 }

надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...