【问题标题】:Is it possible to share multiple text by using share intent?是否可以使用共享意图共享多个文本?
【发布时间】:2015-09-08 05:12:22
【问题描述】:

我打算分享6条文字信息,但它总是只显示最后一条信息,即

share.putExtra(Intent.EXTRA_TEXT, Contact); 

我也试过用一个字符串数组来存储全部6个信息,即:

share.putExtra(Intent.EXTRA_TEXT, stringArray); 

但是,它仍然不起作用。任何人都可以帮忙吗?谢谢。

我的代码:

public class SingleJobActivity extends Activity {

// JSON node keys
private static final String TAG_POSTNAME = "PostName";
private static final String TAG_LOCATION = "Location";
private static final String TAG_SALARY = "Salary";

private static final String TAG_RESPONSIBILITY = "Responsibility";
private static final String TAG_COMPANY = "Company";
private static final String TAG_CONTACT = "Contact";


String PostName;
String Location;
String Salary;
String Responsibility;
String Company;
String Contact;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_job_json_parsing);

    // getting intent data
    Intent in = getIntent();

    // Get JSON values from previous intent
    PostName = in.getStringExtra(TAG_POSTNAME);
    Location = in.getStringExtra(TAG_LOCATION);
    Salary = in.getStringExtra(TAG_SALARY);

    Responsibility = in.getStringExtra(TAG_RESPONSIBILITY);
    Company = in.getStringExtra(TAG_COMPANY);
    Contact = in.getStringExtra(TAG_CONTACT);

    // Displaying all values on the screen
    TextView lblPostName = (TextView) findViewById(R.id.PostName_label);
    TextView lblLocation = (TextView) findViewById(R.id.Location_label);
    TextView lblSalary = (TextView) findViewById(R.id.Salary_label);

    TextView lblResponsibility = (TextView) findViewById(R.id.Responsibility_label);
    TextView lblCompany = (TextView) findViewById(R.id.Company_label);
    TextView lblContact = (TextView) findViewById(R.id.Contact_label);

    lblPostName.setText(PostName);
    lblLocation.setText(Location);
    lblSalary.setText(Salary);

    lblResponsibility.setText(Responsibility);
    lblCompany.setText(Company);
    lblContact.setText(Contact);

    // listeners of our  button
    View.OnClickListener handler = new View.OnClickListener() {
        public void onClick(View v) {
            switch (v.getId()) {

                case R.id.share:
                    shareTextUrl();
                    break;

            }
        }
    };

    // our button
    findViewById(R.id.share).setOnClickListener(handler);
}

// Method to share either text or URL.
private void shareTextUrl() {
    Intent share = new Intent(android.content.Intent.ACTION_SEND);
    share.setType("text/plain");
    share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);


    // Add data to the intent, the receiving app will decide
    // what to do with it.
    share.putExtra(Intent.EXTRA_SUBJECT, "Job Information:");
    share.putExtra(Intent.EXTRA_TEXT, PostName);
    share.putExtra(Intent.EXTRA_TEXT, Location);
    share.putExtra(Intent.EXTRA_TEXT, Salary);
    share.putExtra(Intent.EXTRA_TEXT, Responsibility);
    share.putExtra(Intent.EXTRA_TEXT, Company);
    share.putExtra(Intent.EXTRA_TEXT, Contact);


    startActivity(Intent.createChooser(share, "Share via"));
}

}

【问题讨论】:

  • 看起来除了与共享规则兼容之外没有其他办法。唯一可能的解决方案是像其他应用程序一样将共享内容连接到一个字符串中。

标签: android button android-intent share


【解决方案1】:

你的实际代码有什么问题

我们先来了解一下为什么只拿到最后一条数据。

您的问题是 Java 中的惯例(这也适用于您正在使用的 android.content.Intent.html#putExtra(String, String[]) 方法)方法“putXXX”用您传递的新值替换实际值(如果存在)。 这类似于java.util.Map.html#put(K, V) 方法。

第一个可能的解决方案

要使您当前的代码正常工作,您每次都需要为额外数据使用不同的密钥,即类似这样:

share.putExtra(SingleJobActivity.EXTRA_TEXT_NAME, PostName);
share.putExtra(SingleJobActivity.EXTRA_TEXT_LOCATION, Location);
share.putExtra(SingleJobActivity.EXTRA_TEXT_SALARY, Salary);
share.putExtra(SingleJobActivity.EXTRA_TEXT_RESPONSIBILITY, Responsibility);
share.putExtra(SingleJobActivity.EXTRA_TEXT_COMPANY, Company);
share.putExtra(SingleJobActivity.EXTRA_TEXT_CONTACT, Contact);

这可以正常工作(假设您将所使用的密钥声明为 public static final,并且您遵守 Android 合同以获得额外的数据密钥,例如使用密钥的完整包名(例如 public static final EXTRA_TEXT_NAME = "com.yourpackage.EXTRA_DATA_NAME";)。

第二种可能的解决方案

另一种方法是使用 String[] 传递一个额外的内容(请参阅method documentation)。

String[] extraParams = new String[6];
extraParams[0] = PostName;
extraParams[1] = Location;
extraParams[2] = Salary;
extraParams[3] = Responsibility;
extraParams[4] = Company;
extraParams[5] = Contact;
share.putExtra(SingleJobActivity.EXTRA_TEXT, extraParams);

然后在您的新活动中,您使用android.content.Intent.html#getStringArrayExtra(String) 方法检索此数组。

Intent intent = getIntent();
String[] extraParams = intent.getStringArrayExtra(SingleJobActivity.EXTRA_TEXT);

【讨论】:

    【解决方案2】:

    您可以将单个字符串连接成更大的字符串,并且可以得到它

    Intent iin = getIntent();
    Bundle b = iin.getExtras();
    if (b != null) {
        String j = (String) b.get("name");
        JSONObject name = new JSONObject(j);
    
        Textv.setText(name.getString("postName"));
        TextvDesc.setText(name.getString("location"));
    }
    

    【讨论】:

      【解决方案3】:

      有人可以帮忙吗?

      将六个字符串连接成一个更大的字符串,并共享那个更大的字符串。

      【讨论】:

      • 谢谢!有效。我是这样做的:String a= PostName + Location + Salary + Responsibility + Company + Contact; String contentShare = new String(a); >>> share.putExtra(Intent.EXTRA_TEXT, contentShare);但是,当我尝试在 Emulator 中分​​享时,这 6 个文本只是“粘在一起”,相反,我打算在每个文本之间进行休息:例如第一行:A,第二行:B,第三行:C ....现在,它是:第一行:A B C ....你能建议吗?谢谢
      • @ncc785:“你能给点建议吗?” -- 在每段之间添加换行符 ("\n")。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2012-02-04
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多