2011-04-30 18 views
3

我該如何解釋我的問題?回到上一個TabActivity

我有一個應用程序使用標籤(通過意圖,而不是意見)。我已經在每個視圖中實現了導航,沒有任何麻煩,但是我需要從全屏幕和橫向模式中的一個活動(因此沒有選項卡)中的ListView啓動視頻播放器。但是當我想要玩這個玩家時,(通過按回或調用finish();),我的應用程序關閉(LogCat中沒有例外)並返回到主屏幕。 所以我需要的是當我退出全屏時活動(爲玩家啓動)將回到我的應用程序,與選項卡。

這裏是我的代碼:

//Main activity : 

package com.ccn; 


import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.widget.TabHost; 

public class CCNMain extends TabActivity { 
    public static TabHost tabHost; 
    static CCNMain myActivity = null; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     myActivity = this; 

     Resources res = getResources(); 
     tabHost = getTabHost(); 
     TabHost.TabSpec spec; // reusable tabspec for each tab 
     Intent intent; 

     intent = new Intent().setClass(this, NewsGroup.class); 
     spec = tabHost.newTabSpec("nnews") 
     .setIndicator("A la une",res.getDrawable(R.drawable.home)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     /*intent = new Intent().setClass(this, ArticlesGroup.class); 
     spec = tabHost.newTabSpec("aarticles") 
     .setIndicator("Articles",res.getDrawable(R.drawable.articles)) 
     .setContent(intent); 
     tabHost.addTab(spec);*/ 

     intent = new Intent().setClass(getApplicationContext(), ContactGroup.class); 
     spec = tabHost.newTabSpec("vvideos") 
     .setIndicator("Vidéos",res.getDrawable(R.drawable.video)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(getApplicationContext(), ContactGroup.class); 
     spec = tabHost.newTabSpec("ccontact") 
     .setIndicator("Contact",res.getDrawable(R.drawable.contact)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     tabHost.setCurrentTab(0); 
    } 
} 

//ContactGroup : 
package com.ccn; 

import java.util.ArrayList; 


import android.app.ActivityGroup; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 

public class ContactGroup extends ActivityGroup { 
    // Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view 
    public static ContactGroup groupContact; 

     // Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory. 
    private ArrayList<View> history; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      this.history = new ArrayList<View>(); 
      groupContact = this; 

       // Start the root activity within the group and get its view 
      View view = getLocalActivityManager().startActivity("idHoraireActivity", new 
              Intent(this,ContactActivity.class) 
              .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
              .getDecorView(); 

       // Replace the view of this ActivityGroup 
      replaceView(view); 

     } 

    public void replaceView(View v) { 
       // Adds the old one to history 
     history.add(v); 
       // Changes this Groups View to the new View. 
     setContentView(v); 
    } 

    public void back() { 
     if(history.size() > 1) { 
      history.remove(history.size()-1); 
      setContentView(history.get(history.size()-1)); 
     }else { 
      finish(); 
     } 
    } 
    //@Override 
    public void onBackPressed() { 
     ContactGroup.groupContact.back(); 
     return; 
    } 

} 

//ContactActivity: 
package com.ccn; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.MediaController; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class ContactActivity extends Activity { 
    static ContactActivity bidule = null; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videos); 
     bidule = this; 
     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(); 
       i.setClass(getApplicationContext(), videoPlayerActivity.class); 
       //i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       bidule.startActivity(i); 
       ContactActivity.this.startActivityForResult(i, 0); 
      } 
     }); 

    } 

} 

//VideoPlayerActivity: 
package com.ccn; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.MediaController; 
import android.widget.VideoView; 


public class videoPlayerActivity extends Activity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videos); 


     //the VideoView will hold the video 
     String url = // Video url; 

     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       finish(); 
      } 
     }); 
    } 


} 

在這裏,我的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.ccn" 
     android:versionCode="1" 
     android:versionName="1.0"> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 


    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".CCNMain" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="ArticlesGroup"></activity> 
     <activity android:name="ContactGroup"></activity> 
     <activity android:name="NewsGroup"></activity> 
     <activity android:name="NewsActivity"></activity> 
     <activity android:name="ArticlesAvtivity"></activity> 
     <activity android:name="ContactActivity"></activity> 
     <activity android:name="videoPlayerActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:screenOrientation="landscape"></activity> 

    </application> 
</manifest> 

謝謝您的幫助。 我的猜測:它與我稱之爲startActivity和Intent標誌的位置有關。 你覺得呢?

回答

1

編輯

/Main activity : 

package com.ccn; 


import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.widget.TabHost; 

public class CCNMain extends TabActivity { 
    public static TabHost tabHost; 
    static CCNMain myActivity = null; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     myActivity = this; 

     Resources res = getResources(); 
     tabHost = getTabHost(); 
     TabHost.TabSpec spec; // reusable tabspec for each tab 
     Intent intent; 

     intent = new Intent().setClass(this, NewsGroup.class); 
     spec = tabHost.newTabSpec("nnews") 
     .setIndicator("A la une",res.getDrawable(R.drawable.home)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     /*intent = new Intent().setClass(this, ArticlesGroup.class); 
     spec = tabHost.newTabSpec("aarticles") 
     .setIndicator("Articles",res.getDrawable(R.drawable.articles)) 
     .setContent(intent); 
     tabHost.addTab(spec);*/ 

     intent = new Intent().setClass(getApplicationContext(), ContactGroup.class); 
     spec = tabHost.newTabSpec("vvideos") 
     .setIndicator("Vidéos",res.getDrawable(R.drawable.video)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(getApplicationContext(), ContactGroup.class); 
     spec = tabHost.newTabSpec("ccontact") 
     .setIndicator("Contact",res.getDrawable(R.drawable.contact)) 
     .setContent(intent); 
     tabHost.addTab(spec); 

     tabHost.setCurrentTab(0); 
    } 
} 

//ContactGroup : 
package com.ccn; 

import java.util.ArrayList; 


import android.app.ActivityGroup; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 

public class ContactGroup extends ActivityGroup { 
    // Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view 
    public static ContactGroup groupContact; 

     // Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory. 
    private ArrayList<View> history; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      this.history = new ArrayList<View>(); 
      groupContact = this; 

       // Start the root activity within the group and get its view 
      View view = getLocalActivityManager().startActivity("idHoraireActivity", new 
              Intent(this,ContactActivity.class) 
              .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
              .getDecorView(); 

       // Replace the view of this ActivityGroup 
      replaceView(view); 

     } 

    public void replaceView(View v) { 
       // Adds the old one to history 
     history.add(v); 
       // Changes this Groups View to the new View. 
     setContentView(v); 
    } 

    public void back() { 
     if(history.size() > 1) { 
      history.remove(history.size()-1); 
      setContentView(history.get(history.size()-1)); 
     }else { 
      finish(); 
     } 
    } 
    //@Override 
    public void onBackPressed() { 
     ContactGroup.groupContact.back(); 
     return; 
    } 

} 

//ContactActivity: 
package com.ccn; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.MediaController; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class ContactActivity extends Activity { 
    //static ContactActivity bidule = null; 
     ContactGroup contactGroup = null; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videos); 
     //bidule = this; 
     contactGroup = new ContactGroup(); 

     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       View view = getLocalActivityManager().startActivity("videoPlayerActivity", new 
              Intent(this,videoPlayerActivity.class) 
              .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
              .getDecorView(); 
       contactGroup.replaceView(view); 
      } 
     }); 

    } 

} 

//VideoPlayerActivity: 
package com.ccn; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.MediaController; 
import android.widget.VideoView; 


public class videoPlayerActivity extends Activity { 
    ContactGroup contactGroup = null; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videos); 
     ContactGroup contactGroup = new ContactGroup(); 

     //the VideoView will hold the video 
     String url = // Video url; 

     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       contactGroup.back(); 
      } 
     }); 
    } 

摘要:

你得叫repalaceView和你的活動組的背面方法。當你想開始新的活動使用replaceView(),當你想完成你的活動使用back()

+0

不,我有問題的任何untabbed活動或外部(如瀏覽器),如果我從一個活動內的TabActivity內啓動它的活動:當孩子活動完成後,它不會回到我的TabActivity,但主屏幕! – dranfi 2011-05-07 23:34:43

0

我已經實施了同一種情況。但沒有使用ActivityGroup。在測試中,很明顯它的響應不是防水的。當我啓動Mediaplayer活動並將新活動放入堆棧並且操作系統正確處理後退事件時。

public class VideoActivity extends Activity { 
private ListView mListView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    mListView = (ListView)findViewById(R.id.list); 
    mListView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent().setClass(view.getContext(), ViewVideoActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

VieoVideoActivity是一種全屏活動,強制在橫向上,沒有重寫的關鍵事件實現。

+0

如果您將videoActivity放在保存MainActivity的ActivityGroup中,並調用finish(),則結果應該與報告一致。嘗試啓動Activity而不將其添加到ActivityGroup的歷史堆棧中。 – nahwarang 2011-05-08 12:58:02

0

我希望我能正確理解您的查詢(請糾正我)。 TabActivity中有多個選項卡,除一個選項卡外,其他所有選項都與TabActivity中的「內部」關聯。對於視頻,您希望它在TabActivity的相同級別啓動(不在裏面)。這樣系統就可以處理VideoActivity的後退事件。

|  | 
|  | 
|T (1)| <- tab activity with tab#1 
------- 

選擇標籤#:

|  | 
|  | 
|T (2)| <- tab activity with tab#2 
------- 

選擇標籤#視頻:

|  | 
|Video| <- video activity 
|T (2)| <- tab activity with tab#2 
------- 

既然你可以創建 「子行動」 沒有問題,我在這裏只是告訴你如何創建外部活動意圖:

private void createExternalTab(Class clazz, String tag, String label, int iconResId) { 
    // intent to launch the activity externally 
    final Intent intent = new Intent(this, clazz); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    tabHost.addTab(tabHost.newTabSpec(tag) 
      .setContent(R.id.dummy) 
      .setIndicator(label, iconResId)); 
    // find the recently added tab 
    TabWidget w = tabHost.getTabWidget(); 
    View view = w.getChildAt(w.getChildCount() - 1); 
    // here is the magic! 
    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(intent); 
     } 
    }); 
} 

這裏是TabActivity佈局:

<?xml version="1.0" encoding="utf-8"?> 

<TabHost 
    android:id="@android:id/tabhost" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <View 
       android:id="@+id/dummy" 
       android:layout_width="0dp" 
       android:layout_height="0dp"/> 

      </FrameLayout> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:orientation="horizontal" 
      android:showDividers="none"/> 
    </RelativeLayout> 

</TabHost> 

注1:我的代碼與FragmentActivity

注2:關鍵點這裏:標籤內容映射到R.id.tabcontent內部的不可見元素。然後修改選項卡的onClickListener,以便在TabActivity下調用Intent,而不是由TabWidget/TabHost啓動。