2011-07-13 15 views
0

私の要件によると、私は自分のアプリケーションのタブを実装する必要があります。このように、各タブは複数のアクティビティに関連付けられます。のような:Tab1、Tab2、Tab3 ...など。Tab1:Activity1、Activity2、Activity3 ....など。私はこのような順序で活動を開始したい: 例:Tab1 - > Activity1 - > Activity2。これはいいです、私はそれを実行しました。デバイスの戻るボタンを押してコールバックを取得するにはどうすればよいですか?

Activity2のデバイスのバックキーを押すと、ホーム画面に戻りますが、アクティビティ1になるはずです。しかし、私はUIコンポーネント(バックボタンのような)を介して戻っている場合、それは正常に動作しています。

以下は、私のTabGoupActivityとActivity1、Activity2の実装です。

TabGruopActivity: -

public class TabGroupActivity extends ActivityGroup { 

    private ArrayList<String> mIdList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

    @Override 
    public void finishFromChild(Activity child) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     int index = mIdList.size()-1; 

     if (index < 1) { 
      finish(); 
      return; 
     } 

    // manager.destroyActivity(mIdList.get(index), true); 
     mIdList.remove(index); index--; 
     String lastId = mIdList.get(index); 
     Intent lastIntent = manager.getActivity(lastId).getIntent(); 
     Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     setContentView(newWindow.getDecorView()); 
     } 

     public void startChildActivity(String Id, Intent intent) {  
     Window window = null; 
     try{ 
     window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)); 
     }catch(Exception e){ 
      System.out.println(e.toString()); 
     } 
     if (window != null) { 
      mIdList.add(Id); 
      setContentView(window.getDecorView()); 
     } 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    public void onBackPressed () { 
     int length = mIdList.size(); 
     if (length >= 1) { 
      Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 
      current.finish(); 
     } 
    } 
} 

TabGroup1Activity:(アクティビティの上)TabGroupActivityを拡張: -

public class TabGroup2Activity extends TabGroupActivity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     startChildActivity("Activity2", new Intent(this, DemoActivity2.class)); 
    } 

} 

Activity1: -

public class DemoActivity2 extends Activity { 

    Context context; 

    protected static LocalActivityManager mLocalActivityManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.demo_activity2); 
     context = this; 

     Button button = (Button) findViewById(R.id.Button01); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(context, DemoActivity3.class); 
       TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
       parentActivity.startChildActivity("Activity3", intent); 
      } 
     }); 

     Button button2 = (Button) findViewById(R.id.Button02); 
     button2.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(
         ScrollableTabActivity.ACTION_CHANGE_TAB); 
       intent.putExtra(ScrollableTabActivity.CURRENT_TAB_INDEX, 0); 
       sendBroadcast(intent); 
      } 
     }); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
      parentActivity.onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 
} 

Activity2: -

public class DemoActivity3 extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.demo_activity3); 

     Button button = (Button) findViewById(R.id.Button01); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
       parentActivity.onBackPressed(); 
      } 
     }); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
      parentActivity.onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 
} 

デバイスバックボタンが機能しない理由を教えてもらえますか?

+0

は、フォーカスの問題のように聞こえます。何か他のものがonKeyイベントを取得しています。 – Erik

+0

はい、私たちが(複数の活動を維持している)タブグループ活動を立ち上げる場所から家庭に来ています。もっと明確にする必要があれば教えてください....ありがとう... – Avnish

+0

これを見てください:http://ericharlow.blogspot.com/2010/09/experience-multiple-android-activities.html – Erik

答えて

0

私はTabHostとTabActivityを使用しますが、これはあなたの必要に応じて機能する必要があります。 は、あなたがそれを使用することができます願っています:)

あなたの内側にこのリスナーを置く:

public class TabGroupActivity extends ActivityGroup 

リスナー:

:、ニーズのカスタムリスナーを深め登録解除あなたTabGroupActivityレジスタ/インサイド

myListener = new MyListener(); 

    protected class MyListener extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals("com.test.switchtabs")) { 
      int res = intent.getIntExtra("switch",10); 
      if(res == 0){ 
       tabHost.getTabWidget().getChildAt(0).performClick(); 
      }else if(res == 1){ 
       tabHost.getTabWidget().getChildAt(1).performClick(); 
      }else if(res == 2){ 
       tabHost.getTabWidget().getChildAt(2).performClick(); 
      } 
     }else if (intent.getAction().equals("com.test.sendnow")) { 

      sendTheFiles(); 
     } 

    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (!MyListenerIsRegistered) { 
     IntentFilter intentFilterSwitchTabs = new IntentFilter("com.your.package.switchtabs"); 
     registerReceiver(myListener, intentFilterSwitchTabs); 
     MyListenerIsRegistered = true; 
    } 
} 
@Override 
protected void onPause() { 
    super.onPause(); 
    if (MyListenerIsRegistered && myListener != null) { 
     unregisterReceiver(myListener); 
     MyListenerIsRegistered = false; 
    } 
} 

これをAndroidManifest.xmlに入れますすべての活動から

<activity android:name="com.your.package.TabGroupActivity"> 
    <intent-filter> 
      <action android:name="com.your.package.switchtabs" /> 
    </intent-filter> 
</activity> 

は、タブを変更するには、このようにブロードキャストを送信する、

@Override 
public void onClick(View v) { 

    switch(v.getId()){ 

    case R.id.etx_addtext_drawtext: 

    case R.id.button_back: 
     Intent i = new Intent(); 
     i.putExtra("switch", 1); 
     i.setAction("com.your.package.switchtabs"); 
     sendBroadcast(i); 

     break; 

     } 
} 
関連する問題