簡體   English   中英

從另一個活動返回到活動A的特定片段

[英]Return back to specific fragment of Activity-A from another Activity

在此處輸入圖片說明

我從Activity-A打開Message-Fragment ,然后從Message-Fragment打開Camera-Fragment Message-Fragment 現在,當前片段是Camera-Fragment ,我上面有媒體滑塊。 現在,我有兩個選項,一個是ImagePreview-Fragment ,如果我單擊media-slider上的圖像項,則會打開該圖像。 其他是VideoPreview-Activity ,如果單擊media-slider上的視頻項目,則會打開該視頻。 因此,單擊視頻項目是一種條件。 如果單擊media-slider上的視頻項目並且視頻大小大於10 MB,則打開VideoTrim-Activity並在修剪完成后調用VideoPreview-Activity

我正在從VideoPreview-ActivityImagePreview-Fragment發送媒體。 因此,當我發送媒體時,我想返回帶有數據的Message-Fragment

如何從VideoPreview-Activity (從Camera-Fragment打開)和VideoPreview-Activity (從VideoTrim-Activity打開)返回到Message-Fragment 另外,如果您可以幫助我如何從ImagePreview-Fragment返回到Message-Fragment我將不勝感激。 這些是單獨的問題。 希望能對您有所幫助。

我通過添加片段到backstack addToBackStack(fragmentTag)打開addToBackStack(fragmentTag)

編輯:VideoPreview-Fragment必須是VideoPreview-Activity,而VidoTrim-Fragment必須是VideoTrim-Activity。 這些是活動。 就像您在圖片上看到的一樣。

如果我正確理解了所有內容,我認為我有解決方案。 我將忽略導航的所有其他方面,僅關注您要從VideoPreviewActivity轉到MainActivity並調整片段堆棧的事實,並且這是由完成按鈕(或類似操作)觸發的,而不是后退按鈕觸發的。

簡單的方法是使用活動結果函數startActivityForResult ,該函數將允許您在主活動中使用onActivityResult函數將信息傳回。 然而,你可能會潛在地導航到VideoPreviewActivity通過VideoTrimActivity ,所以你必須通過兩項活動這將是一個有點混亂,回傳給該信息。

因此,我提出的解決方案有幾個步驟。

無需在VideoPreviewActivity上調用finish()即可創建MainActivity

Intent intent = new Intent(context, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra()//Add your return data here
startActivity(intent)

無需啟動新的MainActivity而是將您帶回到上一個活動並完成任務任務中位於其上方的所有活動。

將此函數添加到MainActivity

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
}

然后,在onStart函數中,您可以檢查意圖以查看VideoPreview返回的數據是否存在,並刪除不再需要的片段。

if (getIntent().hasExtra(YOUR_DATA)) {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0)
            getSupportFragmentManager(). popBackStackImmediate("MESSAGE_TAG", 0);
}

其中“ MESSAGE_TAG”是ft.addToBackStack("MESSAGE_TAG")調用中使用的標簽。

這將清除事務中帶有addToBackStack所有片段。 MessageFragment將再次開始其生命周期調用,您可以從

getActivity().getIntent()

嘗試這個,

首先在ActivityA中進行框架布局,

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

在activityA中創建方法

 public void openFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, null).commit();
        String backStateName = fragment.getClass().getName();
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = manager.beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment, backStateName);
        fragmentTransaction.addToBackStack(backStateName);
        fragmentTransaction.commit();
    }

完成之后,在您的mainactivity中,然后覆蓋類似的方法

@Override
    public void onBackPressed() {
        int count = getSupportFragmentManager().getBackStackEntryCount();
        if (count == 0) {
            if (exit) {
                finish(); // finish activity
            } else {
                Toast.makeText(this, "Press Back again to Exit.",
                        Toast.LENGTH_SHORT).show();
                exit = true;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        exit = false;
                    }
                }, 2 * 1000);

            }
        } else {
            getSupportFragmentManager().popBackStackImmediate();
            int c = getSupportFragmentManager().getBackStackEntryCount();
        }
    }

用這種方式

Fragment fragment;
   fragment = new FS_PLKit_Calculator();        
   ((FS_Home) getActivity()).openFragment(fragment);

嘗試這種方式可以保持流程的后向。

暫無
暫無

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

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