Копировать в буфер обмена — Android studio (getString — settextView)

#java #android #android-studio #clipboard

#java #Android #android-studio #буфер обмена

Вопрос:

Я пытаюсь добавить кнопку «копировать» в settextview.

Вот мой полный код:

 public class activity_tasks extends AppCompatActivity {
    private Button button_refresh;
    TextView textView;
    TextView textView4;
    private AdView mAdView;


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tasks);

        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });
        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        button_refresh = findViewById(R.id.button_refresh);

        button_refresh.setOnClickListener(v -> {

            finish();
            startActivity(getIntent());
            overridePendingTransition(0, 0);
        });

        Button button = findViewById(R.id.button1);
        Button button_copy = findViewById(R.id.button_copy);
        button.setOnClickListener(v -> showInfo());
        textView = findViewById(R.id.textView4);
        downloadJSON();




    }

    private void downloadJSON() {


        @SuppressLint("StaticFieldLeak")
        class DownloadJSON extends AsyncTask<Void, Void, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }


            @Override
            protected void onPostExecute(String s) {

                try {
                    settextView(s);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            protected String doInBackground(Void... voids) {
                try {
                    URL url = new URL("https://www.URL.app/api/tasks.php");
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    StringBuilder sb = new StringBuilder();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String json;
                    while ((json = bufferedReader.readLine()) != null) {
                        sb.append(json).append("n");
                    }
                    return sb.toString().trim();
                } catch (Exception e) {
                    return null;
                }
            }
        }
        DownloadJSON getJSON = new DownloadJSON();
        getJSON.execute();
    }

    private void settextView(String json) throws JSONException {
        JSONArray jsonArray = new JSONArray(json);
        String[] tasks = new String[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i  ) {
            JSONObject obj = jsonArray.getJSONObject(i);
            tasks[i] = obj.getString("Task_title")   ".nn"   obj.getString("task_description");


            textView.setText(tasks[0]);


        }
 

Моя проблема в том, что я не уверен, где разместить следующий код:

             button_copy.setOnClickListener(v -> {

                ClipboardManager clipboard = (ClipboardManager)getApplicationContext().getSystemService(getApplicationContext().CLIPBOARD_SERVICE);
                ClipData clip = ClipData.newPlainText("", obj.getString("Task_title")   ".nn"   obj.getString("task_description"));
                clipboard.setPrimaryClip(clip);
                Toast.makeText(getApplicationContext(), "Copied to clipboard!", Toast.LENGTH_LONG).show();

            });
 

Я попытался поместить его в settextView, однако, когда я попадаю на страницу и генерируется текст, он автоматически копирует — но я хочу, чтобы это относилось к кнопке, а не к автоматическому копированию.
Для справки, кнопка в моем activity_list.xml это button_copy.

Комментарии:

1. вы можете поместить кнопку копировать в postExecute . Покажите кнопку копировать после завершения процесса.

2. Спасибо за это, но когда я помещаю его после e.printStackTrace(); } , он не может найти текст: obj становится красным — есть идеи?

3. Я обновил ответ. Пожалуйста, проверьте ответ

Ответ №1:

Для большего упрощения поместите кнопку внутри settextview . Когда процесс все еще продолжается, нам нужно скрыть / что-то сделать с кнопкой. Вы можете скрыть его при создании .setVisibility для кнопки. После этого вы можете показать кнопку.

   private void settextView(String json) throws JSONException {
        JSONArray jsonArray = new JSONArray(json);
        String[] tasks = new String[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i  ) {
            JSONObject obj = jsonArray.getJSONObject(i);
            tasks[i] = obj.getString("Task_title")   ".nn"   obj.getString("task_description");

        textView.setText(tasks[0]);
        button_copy.setVisibility(View.VISIBLE); //Visible it
        setBtnCopyOnClick(tasks[0]); //Here


    }
 

А затем создайте метод для btn

 private void setBtnCopyOnClick(String text){
 button_copy.setOnClickListener(v -> {

            ClipboardManager clipboard = (ClipboardManager)getApplicationContext().getSystemService(getApplicationContext().CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("", text);
            clipboard.setPrimaryClip(clip);
            Toast.makeText(getApplicationContext(), "Copied to clipboard!", Toast.LENGTH_LONG).show();

        });
}
 

Комментарии:

1. Куда мне точно поместить этот метод? в пределах settextView? или где-то еще?

2. Где часть, которую вы не понимаете. Я уже прокомментировал там эту информацию. @sgccommander

3. Я не уверен, куда поместить метод btn.

4. 1. замените метод settextview на этот. 2. создайте имя метода setBtnCopyOnClick 3. Переместите все коды для button_copy внутри метода setBtnCopyOnClick . @sgcccommander

5. Хорошо, я выполнил вашу инструкцию, и когда я добавляю код, он выдает эту ошибку: ошибка: неучтенное исключение JSONException; должно быть перехвачено или объявлено для выброса ClipData clip =ClipData.newPlainText(«», obj.getString(«Task_title») «.n n» obj.getString(«task_description»));

Ответ №2:

Спасибо Ticherhaz за то, что помог мне!

Следуя его инструкциям, проблема заключалась в неправильном атрибуте String, поэтому новый код был:

     private void setBtnCopyOnClick(String task) {
        Button button_copy = findViewById(R.id.button_copy);
        button_copy.setOnClickListener(v -> {
            ClipboardManager clipboard = (ClipboardManager)getApplicationContext().getSystemService(getApplicationContext().CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("", task);
            clipboard.setPrimaryClip(clip);
            Toast.makeText(getApplicationContext(), "Copied to clipboard!", Toast.LENGTH_LONG).show();

        });