#android #android-actionbar
Вопрос:
Я пытаюсь добавить кнопку «Поделиться» на панель действий. Я правильно создал xml-файл, и это код: реализация шифра цезаря, который принимает int и строку в качестве входных данных и отображает результат в другом редактируемом тексте. Я думаю, что проблема должна быть из-за частого обновления (добавления) текста редактирования результата. Когда я нажимаю кнопку «Поделиться», он успешно перенаправляется в указанное место назначения, но и тема, и текст пусты. (попробовал с помощью Google keep). Обратите внимание, что я использую строки shareSubject и shareText в методе onCreateOptionsMenu.
public class EncrActivity extends Activity {
Button ok, next;
EditText etKey, text, res;
String input, result = "";
int key;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.encr_activity);
ok = (Button) findViewById(R.id.bOk);
next = (Button) findViewById(R.id.bNext);
etKey = (EditText) findViewById(R.id.etKey);
text = (EditText) findViewById(R.id.etText);
res = (EditText) findViewById(R.id.etResult);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (etKey.getText().length() == 0) {
Toast.makeText(getApplicationContext(),
"please enter a valid value for a",
Toast.LENGTH_LONG).show();
} else {
key = Integer.parseInt(etKey.getText().toString());
}
encrypt(key);
}
});
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (etKey.getText().length() == 0) {
key = 0;
} else {
key = Integer.parseInt(etKey.getText().toString());
}
key ;
etKey.setText("" key);
encrypt(key);
}
});
}
public boolean isAlpha(int x) {
if ((x >= 65 amp;amp; x <= 90) || (x >= 97 amp;amp; x <= 122)) {
return true;
} else {
return false;
}
}
public void encrypt(int shift){
res.setText("");
if (text.getText().length() == 0) {
Toast.makeText(getApplicationContext(),
"please don't leave the input empty",
Toast.LENGTH_LONG).show();
} else {
input = text.getText().toString();
}
int length = input.length();
for (int i = 0; i < length; i ) {
int y = input.charAt(i);
if (isAlpha(y)) {
if (Character.isUpperCase(y)) {
int character = (((y - 65) shift) % 26) 65;
char charac = (char) character;
res.append(charac "");
} else if (Character.isLowerCase(y)) {
int character = (((y - 97) shift) % 26) 97;
char charac = (char) character;
res.append(charac "");
}
} else {
res.append(input.charAt(i) "");
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
String shareSubject = EncrActivity.this.etKey.getText().toString();
String shareText = EncrActivity.this.res.getText().toString();
getMenuInflater().inflate(R.menu.action_bar_share_menu, menu);
MenuItem item = menu.findItem(R.id.menu_item_share);
ShareActionProvider myShareActionProvider = (ShareActionProvider) item.getActionProvider();
Intent myIntent = new Intent();
myIntent.setAction(Intent.ACTION_SEND);
myIntent.setType("text/plain");
myIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, shareSubject);
myIntent.putExtra(Intent.EXTRA_TEXT, shareText);
myShareActionProvider.setShareIntent(myIntent);
return true;
}
}
Ответ №1:
Проблема в том, что меню (и, следовательно, намерение поделиться) создается сразу после загрузки действия. В этот момент редактируемый текст все еще пуст.
Вместо этого вы должны:
- Сохраните ссылку
ShareActionProvider
наonCreateOptionsMenu()
вход . - Когда вы звоните
encrypt()
, создайте новое намерение и позвонитеsetShareIntent()
.
Таким образом, намерение поделиться будет обновлено при выполнении действия поделиться.
Комментарии:
1. спасибо за ответ, кстати, есть ли подобный пример на stackoverflow или где-либо еще в Интернете, так как я немного запутался (новичок)
2. @user3810325 См . developer.android.com/reference/android/widget/… Это в основном тот же шаблон: сохраните ссылку, а затем заполните намерение позже.