Тема и текстовые поля ShareActionProvider оставлены пустыми — android

#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/… Это в основном тот же шаблон: сохраните ссылку, а затем заполните намерение позже.