#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
. @sgcccommander5. Хорошо, я выполнил вашу инструкцию, и когда я добавляю код, он выдает эту ошибку: ошибка: неучтенное исключение 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();
});