簡體   English   中英

控制后退按鈕功能

[英]Control back button functionality

從圖片中給定的ListView中,我選擇要發送短信的聯系人並轉到另一個活動(第二張圖片)。 並從此短信Activity圖片獲得。 當我按回手機上可用的硬件按鈕時,我應該移到想要的位置。 我不希望顯示默認的Activity 我怎樣才能做到這一點?

public class SendSms extends Activity{
ListView listView;
List<RowItems> rowItems;
CustomListViewAdapter adapter;

String toNumbers = "";
String separator;
int i=0,j,count=0,count1; String a[]=new String[5];
String number,val2;

 @Override
  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new4); 
listView = (ListView) findViewById(R.id.list);

rowItems = new ArrayList<RowItems>();

val2=getIntent().getStringExtra("name");
 ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null,   null);


 if (cur.getCount() > 0) {

    while (cur.moveToNext()) {
  String rawContactId =              cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

  Cursor c = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] {
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                   // ContactsContract.CommonDataKinds.Phone.TYPE,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.PHOTO_ID
            }, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[] { rawContactId }, null);
  if (c != null) {
        if (c.moveToFirst()) {
            String number = c.getString(0);
            //int type = c.getInt(1);
            String name = c.getString(1);
            int photoId = c.getInt(2);
            Bitmap bitmap = queryContactImage(photoId);
            RowItems p=new RowItems(bitmap, number, name);
            rowItems.add(p);

        } 
        adapter = new CustomListViewAdapter(this,
                R.layout.new5, rowItems);
        listView.setAdapter(adapter);


        c.close();
    }
}
    }
}


 private Bitmap queryContactImage(int imageDataRow) {
Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {
    ContactsContract.CommonDataKinds.Photo.PHOTO
}, ContactsContract.Data._ID + "=?", new String[] {
    Integer.toString(imageDataRow)
}, null);
byte[] imageBytes = null;
if (c != null) {
    if (c.moveToFirst()) {
        imageBytes = c.getBlob(0);
    }
    c.close();
}

if (imageBytes != null) {
    return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
} else {
    return null;
  }
  } 
    public void showResult(View v) {
// String result = "";
String result1="";
    for (RowItems p : adapter.getBox()) {
      if (p.chck){
       // result += "\n" + p.getTitle();
        result1 +="\n" +p.getDesc();
        a[i]=p.getTitle();
        i++;
       count++;
      }
      count1=count; 
    } 

    Toast.makeText(this, result1+"\n", Toast.LENGTH_LONG).show();
  }



       public void send(View v) throws IOException {
    int value=a.length-count1;
    for(j=0;j<a.length-value;j++){   
         if(android.os.Build.MANUFACTURER.equalsIgnoreCase("Samsung")){   
                separator = ",";   
            } else   
                separator = ";";       


     number = a[j];   
    toNumbers= toNumbers +number +separator;   

}  

 toNumbers = toNumbers.substring(0, toNumbers.length());


    Uri sendSmsTo = Uri.parse("smsto:" + toNumbers);

    String smsValue = "help iam in danger..i am presently at \n"+val2;
    if(val2==null){
        Toast.makeText(SendSms.this, "wait.....", Toast.LENGTH_LONG).show();
    }

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setType("vnd.android-dir/mms-sms");
    intent.putExtra("sms_body", smsValue);
    intent.setData(sendSmsTo);

    startActivity(intent);

    }

使用startAtctivityForResult,然后在onActivityResult中檢查resultCode。 如果是Activity.RESULT_CANCELLED,則用戶“退出” SMS活動。 由於SMS活動的實現不在您的控制范圍之內,因此,如果結果代碼表明已被取消,則可能不是唯一的情況。

將此方法添加到類中以處理設備后退按鈕。

@Override
public void onBackPressed() {
// do something
}

請注意,它要求API級別5或更高。

我認為您應該在顯示“ Activity圖片時嘗試調用onBackPressed方法。

// back button pressed method
@Override
public void onBackPressed() {
     super.onBackPressed();
     // new intent to call an activity that you choose
     Intent intent = new Intent(this, NewActivity.class);
     startActivity(intent);
     // finish the activity picture
     this.finish();
}

如果您不想調用外部Activity ,則可以按以下方式隱藏通過Intent調用的布局:

// back button pressed method
@Override
public void onBackPressed() {
     super.onBackPressed();
     // your layout with the picture is displayed, hide it
     if(MySecondView.getVisibility() == View.VISIBLE)
            MySecondView.setVisibility(View.Gone);  
     // display the layout that you want
     MyDefaultView.setVisibility(View.VISIBLE); 
}  

就像我在下面說的那樣,請嘗試在您的Class開頭將布爾值初始化為false。 當您啟動Intent.ACTION_VIEW ,請將此布爾值設為true:

public class Foo extends Activity {
    private boolean isSms = false;
    // some stuff  

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setType("vnd.android-dir/mms-sms");
    // ...
    startActivity(intent);  
    // make your boolean to true  
    isSms = true;  

    // create the onBackPressed method  
    @Override
    public void onBackPressed() {
          // check if the user is on the sms layout
          if(isSms)
              // do something  
          else
              // do something else like finish(); your activity

     }

 }  

或者,您可以嘗試使用onKeyDown方法(請參見此處: onKeyDown(int keyCode,KeyEvent事件) ),如下所示:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0) {
        // dome some stuff
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

您可以在這里看到這兩種方法之間的差異: onBackPressed()不起作用以及我在下面的評論中提及的網站上。
希望這會有用。


更新:
更好的方法應該是使用startActivityForResult來啟動Intent.ACTION_VIEW:

startActivityForResult(intent, 1);  

然后,您返回取消代碼,如下所示:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode != 1 && resultCode == RESULT_CANCELED) {
        // do something
    }
}  

這是@FunkTheMonk,在上面,他告訴了一個不錯的選擇!

您必須通過調用方法名稱onbackpressed()來覆蓋硬件后退按鈕的后退行為。

@Override
public void onBackPressed() {
 super.onBackPressed();
 // set intent to activity where you want to move on after back press
 Intent intent = new Intent(this, NewActivity.class);
 startActivity(intent);
 // also clean the current activity from stack.
 youractivityname.this.finish();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM