当列表视图中有多个 select 时,我有 2 个工具栏
i got 2 toolbar when multi select in listview
大家好我的应用短信有问题,当我长按一个联系人时它会显示新的工具栏,但我不知道要删除谁的另一个工具栏:/
如果你能帮助我谢谢你..
这是我的主要 activity:
package com.ducha.messavtext;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.provider.Telephony;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import com.ducha.training3.R;
import java.util.ArrayList;
@TargetApi(Build.VERSION_CODES.KITKAT)
public class MainActivity extends AppCompatActivity implements BaseColumns {
private Cursor cursor;
private Cursor cursorPhone;
private Cursor cursorContact;
private final Uri uriSms = Telephony.Sms.CONTENT_URI;
private final Uri uriPhone = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private final Uri uri = Uri.parse("content://sms/inbox");
private String body;
private String numero;
private String id;
private String contact;
private final String[] selectionSms = new String[]{Telephony.Sms._ID, Telephony.Sms.BODY, Telephony.Sms.THREAD_ID, Telephony.Sms.ADDRESS, Telephony.Sms.DATE, Telephony.Sms.READ,};
private final String[] selectionPhone = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,};
private final String[] selectionContact = new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME,};
public static ArrayList<CreateContactAdapter> listContact = new ArrayList<>();;
public static boolean runMain;
public static ContactAdapter adapter;
public static byte[] myPhoto;
private ArrayList<String> idList = new ArrayList<>();;
private Context ctx = this;
private int read;
private int messageUnread = 0;
private ListView lv;
private ArrayList<String> diffNumber;
private byte[] photo;
private Toolbar toolbar;
@Override
protected void onResume() {
super.onResume();
runMain = true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clearIfNotEmpty();
isTheDefaultApp();
findId();
getInfoMain();
getMyContactPicture();
ConfigToolbar();
lv.setAdapter(adapter);
lv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
lv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
final int selectedItem = lv.getCheckedItemCount();
mode.setTitle(selectedItem + " Item selected");
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.select_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem item) {
switch (item.getItemId()) {
case R.id.remove_item:
SparseBooleanArray select = adapter.getSelectedIds();
for (int i = (select.size() - 1); i >= 0; i--) {
if (select.valueAt(i)) {
CreateContactAdapter contact = (CreateContactAdapter) adapter.getItem(select.keyAt(i));
adapter.remove(contact);
}
}
arg0.finish();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
adapter.removeSelection();
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, PrintMessage.class);
String persoId = listContact.get(position).id;
String numero = listContact.get(position).numero;
String contact = listContact.get(position).contact;
String body = listContact.get(position).body;
byte[] bmp = listContact.get(position).photo;
intent.putExtra("id", persoId);
intent.putExtra("numero", numero);
intent.putExtra("contact", contact);
intent.putExtra("photo", bmp);
markMessageRead(ctx, numero, body);
startActivity(intent);
}
});
}
private void clearIfNotEmpty() {
if (!listContact.isEmpty())
listContact.clear();
}
private void getMyContactPicture() {
Uri uriContact = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode("0659641613"));
cursorContact = this.getContentResolver().query(uriContact, selectionContact, null, null, null);
cursorContact.moveToFirst();
long idContact = cursorContact.getLong(0);
myPhoto = openPhoto(idContact);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void isTheDefaultApp() {
final String packageName = MainActivity.this.getPackageName();
if (!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)) {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName);
startActivity(intent);
}
}
private void findId() {
toolbar = (Toolbar) findViewById(R.id.my_toolbar);
lv = (ListView) findViewById(R.id.ListView01);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public void getInfoMain() {
cursor = this.getContentResolver().query(uriSms, selectionSms, null, null, "date DESC");
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
id = cursor.getString(2);
if (!(idList.contains(id))) {
body = cursor.getString(1);
numero = cursor.getString(3);
read = cursor.getInt(5);
if (read == 0)
messageUnread++;
diffNumber = getDifferentNumber(numero);
cursorPhone = this.getContentResolver().query(uriPhone, selectionPhone,
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(0) +"' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(1) + "' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(2) + "' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(3) + "'", null, null);
if (cursorPhone.moveToFirst()) {
contact = cursorPhone.getString(0);
Uri uriContact = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(numero));
cursorContact = this.getContentResolver().query(uriContact, selectionContact, null, null, null);
cursorContact.moveToFirst();
long idContact = cursorContact.getLong(0);
photo = openPhoto(idContact);
if (photo != null)
listContact.add(new CreateContactAdapter(contact, numero, body, id, photo, read));
else
listContact.add(new CreateContactAdapter(contact, numero, body, id, null, read));
} else {
listContact.add(new CreateContactAdapter("no", numero, body, id, null, read));
}
idList.add(id);
}
cursor.moveToNext();
}
}
cursor.close();
adapter = new ContactAdapter(listContact, this);
}
private void ConfigToolbar() {
setSupportActionBar(toolbar);
if (messageUnread > 0)
getSupportActionBar().setTitle("Messages (" + messageUnread + ")");
else
getSupportActionBar().setTitle("Messages");
}
public byte[] openPhoto(long contactId) {
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor cursor = getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
if (cursor == null) {
return null;
}
try {
if (cursor.moveToFirst()) {
byte[] data = cursor.getBlob(0);
if (data != null) {
return data;
}
}
} finally {
cursor.close();
}
return null;
}
private void markMessageRead(Context context, String number, String body) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
while (cursor.moveToNext()) {
if ((cursor.getString(cursor.getColumnIndex("address")).equals(number)) && (cursor.getInt(cursor.getColumnIndex("read")) == 0)) {
if (cursor.getString(cursor.getColumnIndex("body")).startsWith(body)) {
String SmsMessageId = cursor.getString(cursor.getColumnIndex("_id"));
ContentValues values = new ContentValues();
values.put("read", true);
context.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=" + SmsMessageId, null);
return;
}
}
}
} catch (Exception e) {
Log.e("Mark Read", "Error in Read: " + e.toString());
}
}
public ArrayList<String> getDifferentNumber(String number) {
ArrayList<String> num = new ArrayList<>();
if (number.matches("^[06|07]{2}[0-9]{8}")) {
num.add(number.replaceAll(".{2}", "[=11=] "));
num.add(number.replaceAll("06", "+336"));
num.add(number.replaceAll(".{2}", "[=11=] ").replaceAll("0", "+33 "));
num.add(number);
} else if (number.matches("[06|07]{2}( [0-9]{2}){4}")) {
num.add(number.replaceAll(" ", ""));
num.add(number.replaceAll("0", "+33 "));
num.add(number.replaceAll(" ", "").replaceAll("0", "+33"));
num.add(number);
} else if (number.matches("\+[3]{2}[0-9]{8}.")) {
num.add(number.replaceAll("\+33", "0"));
num.add(number.replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] "));
num.add(number.replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] ").replaceAll("^0", "+33 "));
num.add(number);
} else if (number.matches("\+33 [6|7]( [0-9]{2}){4}")) {
num.add(number.replaceAll(" ", ""));
num.add(number.replaceAll(" ", "").replaceAll("\+33", "0"));
num.add(number.replaceAll(" ", "").replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] "));
num.add(number);
} else {
num.add(numero);
num.add(numero);
num.add(numero);
num.add(numero);
}
return num;
}
public boolean edit(MenuItem item) {
// actions
return true;
}
public boolean newMessage(MenuItem item) {
startActivity(new Intent(this, NewMessage.class));
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.setting :
startActivity(new Intent(this, Apparence.class));
}
return true;
}
@Override
protected void onPause() {
super.onPause();
runMain = false;
}
}
尝试将以下内容添加到您的 styles.xml:
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/my_primary_color</item>
<item name="colorPrimaryDark">@color/my_primary_dark_color</item>
<item name="colorAccent">@color/my_accent_color</item>
<item name="windowActionModeOverlay">true</item>
</style>
大家好我的应用短信有问题,当我长按一个联系人时它会显示新的工具栏,但我不知道要删除谁的另一个工具栏:/
如果你能帮助我谢谢你..
这是我的主要 activity:
package com.ducha.messavtext;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.provider.Telephony;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import com.ducha.training3.R;
import java.util.ArrayList;
@TargetApi(Build.VERSION_CODES.KITKAT)
public class MainActivity extends AppCompatActivity implements BaseColumns {
private Cursor cursor;
private Cursor cursorPhone;
private Cursor cursorContact;
private final Uri uriSms = Telephony.Sms.CONTENT_URI;
private final Uri uriPhone = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private final Uri uri = Uri.parse("content://sms/inbox");
private String body;
private String numero;
private String id;
private String contact;
private final String[] selectionSms = new String[]{Telephony.Sms._ID, Telephony.Sms.BODY, Telephony.Sms.THREAD_ID, Telephony.Sms.ADDRESS, Telephony.Sms.DATE, Telephony.Sms.READ,};
private final String[] selectionPhone = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER,};
private final String[] selectionContact = new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME,};
public static ArrayList<CreateContactAdapter> listContact = new ArrayList<>();;
public static boolean runMain;
public static ContactAdapter adapter;
public static byte[] myPhoto;
private ArrayList<String> idList = new ArrayList<>();;
private Context ctx = this;
private int read;
private int messageUnread = 0;
private ListView lv;
private ArrayList<String> diffNumber;
private byte[] photo;
private Toolbar toolbar;
@Override
protected void onResume() {
super.onResume();
runMain = true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clearIfNotEmpty();
isTheDefaultApp();
findId();
getInfoMain();
getMyContactPicture();
ConfigToolbar();
lv.setAdapter(adapter);
lv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
lv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
final int selectedItem = lv.getCheckedItemCount();
mode.setTitle(selectedItem + " Item selected");
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.select_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem item) {
switch (item.getItemId()) {
case R.id.remove_item:
SparseBooleanArray select = adapter.getSelectedIds();
for (int i = (select.size() - 1); i >= 0; i--) {
if (select.valueAt(i)) {
CreateContactAdapter contact = (CreateContactAdapter) adapter.getItem(select.keyAt(i));
adapter.remove(contact);
}
}
arg0.finish();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
adapter.removeSelection();
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, PrintMessage.class);
String persoId = listContact.get(position).id;
String numero = listContact.get(position).numero;
String contact = listContact.get(position).contact;
String body = listContact.get(position).body;
byte[] bmp = listContact.get(position).photo;
intent.putExtra("id", persoId);
intent.putExtra("numero", numero);
intent.putExtra("contact", contact);
intent.putExtra("photo", bmp);
markMessageRead(ctx, numero, body);
startActivity(intent);
}
});
}
private void clearIfNotEmpty() {
if (!listContact.isEmpty())
listContact.clear();
}
private void getMyContactPicture() {
Uri uriContact = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode("0659641613"));
cursorContact = this.getContentResolver().query(uriContact, selectionContact, null, null, null);
cursorContact.moveToFirst();
long idContact = cursorContact.getLong(0);
myPhoto = openPhoto(idContact);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void isTheDefaultApp() {
final String packageName = MainActivity.this.getPackageName();
if (!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)) {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName);
startActivity(intent);
}
}
private void findId() {
toolbar = (Toolbar) findViewById(R.id.my_toolbar);
lv = (ListView) findViewById(R.id.ListView01);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public void getInfoMain() {
cursor = this.getContentResolver().query(uriSms, selectionSms, null, null, "date DESC");
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
id = cursor.getString(2);
if (!(idList.contains(id))) {
body = cursor.getString(1);
numero = cursor.getString(3);
read = cursor.getInt(5);
if (read == 0)
messageUnread++;
diffNumber = getDifferentNumber(numero);
cursorPhone = this.getContentResolver().query(uriPhone, selectionPhone,
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(0) +"' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(1) + "' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(2) + "' OR " +
ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + diffNumber.get(3) + "'", null, null);
if (cursorPhone.moveToFirst()) {
contact = cursorPhone.getString(0);
Uri uriContact = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(numero));
cursorContact = this.getContentResolver().query(uriContact, selectionContact, null, null, null);
cursorContact.moveToFirst();
long idContact = cursorContact.getLong(0);
photo = openPhoto(idContact);
if (photo != null)
listContact.add(new CreateContactAdapter(contact, numero, body, id, photo, read));
else
listContact.add(new CreateContactAdapter(contact, numero, body, id, null, read));
} else {
listContact.add(new CreateContactAdapter("no", numero, body, id, null, read));
}
idList.add(id);
}
cursor.moveToNext();
}
}
cursor.close();
adapter = new ContactAdapter(listContact, this);
}
private void ConfigToolbar() {
setSupportActionBar(toolbar);
if (messageUnread > 0)
getSupportActionBar().setTitle("Messages (" + messageUnread + ")");
else
getSupportActionBar().setTitle("Messages");
}
public byte[] openPhoto(long contactId) {
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Cursor cursor = getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
if (cursor == null) {
return null;
}
try {
if (cursor.moveToFirst()) {
byte[] data = cursor.getBlob(0);
if (data != null) {
return data;
}
}
} finally {
cursor.close();
}
return null;
}
private void markMessageRead(Context context, String number, String body) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
while (cursor.moveToNext()) {
if ((cursor.getString(cursor.getColumnIndex("address")).equals(number)) && (cursor.getInt(cursor.getColumnIndex("read")) == 0)) {
if (cursor.getString(cursor.getColumnIndex("body")).startsWith(body)) {
String SmsMessageId = cursor.getString(cursor.getColumnIndex("_id"));
ContentValues values = new ContentValues();
values.put("read", true);
context.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=" + SmsMessageId, null);
return;
}
}
}
} catch (Exception e) {
Log.e("Mark Read", "Error in Read: " + e.toString());
}
}
public ArrayList<String> getDifferentNumber(String number) {
ArrayList<String> num = new ArrayList<>();
if (number.matches("^[06|07]{2}[0-9]{8}")) {
num.add(number.replaceAll(".{2}", "[=11=] "));
num.add(number.replaceAll("06", "+336"));
num.add(number.replaceAll(".{2}", "[=11=] ").replaceAll("0", "+33 "));
num.add(number);
} else if (number.matches("[06|07]{2}( [0-9]{2}){4}")) {
num.add(number.replaceAll(" ", ""));
num.add(number.replaceAll("0", "+33 "));
num.add(number.replaceAll(" ", "").replaceAll("0", "+33"));
num.add(number);
} else if (number.matches("\+[3]{2}[0-9]{8}.")) {
num.add(number.replaceAll("\+33", "0"));
num.add(number.replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] "));
num.add(number.replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] ").replaceAll("^0", "+33 "));
num.add(number);
} else if (number.matches("\+33 [6|7]( [0-9]{2}){4}")) {
num.add(number.replaceAll(" ", ""));
num.add(number.replaceAll(" ", "").replaceAll("\+33", "0"));
num.add(number.replaceAll(" ", "").replaceAll("\+33", "0").replaceAll(".{2}", "[=11=] "));
num.add(number);
} else {
num.add(numero);
num.add(numero);
num.add(numero);
num.add(numero);
}
return num;
}
public boolean edit(MenuItem item) {
// actions
return true;
}
public boolean newMessage(MenuItem item) {
startActivity(new Intent(this, NewMessage.class));
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.setting :
startActivity(new Intent(this, Apparence.class));
}
return true;
}
@Override
protected void onPause() {
super.onPause();
runMain = false;
}
}
尝试将以下内容添加到您的 styles.xml:
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/my_primary_color</item>
<item name="colorPrimaryDark">@color/my_primary_dark_color</item>
<item name="colorAccent">@color/my_accent_color</item>
<item name="windowActionModeOverlay">true</item>
</style>