14

フラグメントに関するSOに関する質問をかなり多く見ましたが、自分がやりたいことが可能かどうかはまだわかりません。さらに、デザインパターンに欠陥があり、全体を作り直す必要がある場合はさらにそうです。処理する。基本的に、これまでに尋ねられたほとんどの質問と同様に、NavigationTabsを備えたActionBarがあり(ActionBarSherlockを使用)、各タブ内にFragementActivityがあり、行が選択されるとFragmentActivitiesが新しいFragmentsをプッシュします(再作成しようとしています) AndroidのiOSプロジェクトであり、特定の情報にドリルダウンできるいくつかのタブを備えた基本的なナビゲーションベースのアプリです)。電話の戻るボタンをクリックすると、前のフラグメントがロードされますが、フラグメントはそれ自体を再作成し(したがって、ビューごとにWebサービスが再度呼び出されます)、情報がないため、これは必要ありません。後方に移動すると、前のビューで変更されます。つまり、基本的に私が理解したいのは、電話の戻るボタンを押すと、前のフラグメントがすでに作成された前のアイテムでプルアップされるように、フラグメントを設定する方法です。以下は私の現在のコードです:

    //This is from my FragmentActivity Class that contains the ActionBar and Tab Selection Control
    @Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
    int selectedTab = tab.getPosition();

    if (selectedTab == 0) {
        SalesMainScreen salesScreen = new SalesMainScreen();
        ft.replace(R.id.content, salesScreen);
    }
    else if (selectedTab == 1) {
        ClientMainScreen clientScreen = new ClientMainScreen();
        ft.replace(R.id.content, clientScreen);
    }.....

   //This is within the ClientMainScreen Fragment Class, which handles moving to the Detail Fragment
   row.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            //Do something if Row is clicked
                            try{
                                String selectedClientName = clientObject.getString("ClientName");
                                String selectedClientID = clientObject.getString("ClientID");
                                String selectedValue = clientObject.getString("ClientValue");
                                transaction = getFragmentManager().beginTransaction();
                                ClientDetailScreen detailScreen = new ClientDetailScreen();
                                detailScreen.clientID = selectedClientID;
                                detailScreen.clientName = selectedClientName;
                                detailScreen.clientValue = selectedValue;
                                int currentID = ((ViewGroup)getView().getParent()).getId();
                                transaction.replace(currentID,detailScreen);
                                transaction.addToBackStack(null);
                                transaction.commit();

                            }
                            catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });....

     //And then this is the Client Detail Fragment, with the method being called to Call the Web Service and create thew (since what is displayed on this screen is dependent on what is found in the Web Service
          @Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
    return inflater.inflate(R.layout.clientdetailscreen, group, false);
}

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //Setup Preferences File Link
    this.preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

    //initialize the table object
    mainTable = (TableLayout)getActivity().findViewById(R.id.mainTable);

    //setup the detail table
    setupRelatedClientSection();

}

クライアントの詳細画面は、クライアントのメイン画面と同じメソッドを使用してもう一度ドリルダウンできますが、その新しい画面から詳細画面に戻ると、seuptRelatedClientSection()メソッドが再度呼び出されるため、フラグメント全体が再構築されます。本当に私はその画面の保存されたバージョンをプルアップしたいだけです。これは私の現在の設定で可能ですか、それとも間違った方法でアプローチしましたか?

4

4 に答える 4

13

置換する代わりにfragementTransaction.addを使用してみてください

于 2015-08-25T10:38:28.990 に答える
7

私はあなたが探していると信じていshow()ますhide()

まだバックスタックに追加できると思います。

 transaction.hide(currentFragment);
 transaction.show(detailScreen);
 transaction.addToBackStack(null);
 transaction.commit();

私は自分のコードを見ることができませんでしたが、これがどうなるかと思います...他の誰かがより良い方法を持っていない限り、それを試してみてください。show()hide()でバックスタックを試したことはありませんが、トランザクションがコミットする前に行われた変更を取得し、戻るボタンを押すと元に戻すと思います。私が知りたいこの原因について私に戻ってください。

また、これを呼び出す前に、詳細フラグメントが作成されていることを確認する必要があります。これはアイテムのクリックに基づいているため、クリックするたびに詳細フラグメントを作成して、正しい詳細フラグメントが作成されていることを確認する必要があります。

于 2012-12-12T23:46:24.000 に答える
5

将来この質問を参照する可能性のある人々のために、この回答を投稿します。

次のコードは、FragmentAからFragmentBを開き、戻るボタンを押してFragmentBからFragmentAに戻る方法を示しています(FragmentAを更新せずに)。

public class FragmentA extends Fragment{

   ...

   void openFragmentB(){

       FragmentManager fragmentManager = 
           getActivity().getSupportFragmentManager();
       FragmentB fragmentB = FragmentB.newInstance();

       if (fragmentB.isAdded()) {

           return;
       } else {

           fragmentManager.
               beginTransaction().
               add(R.id.mainContainer,fragmentB).
               addToBackStack(FragmentB.TAG).
               commit();
      }
   }
}

public class FragmentB extends Fragment{

    public static final String TAG = 
        FragmentB.class.getSimpleName();

    ...

    public static FragmentB newInstance(){

        FragmentB fragmentB = new FragmentB();
        return fragmentB;
    }

    @Override
    public void onResume() {

        super.onResume();
        // add this piece of code in onResume method
        this.getView().setFocusableInTouchMode(true);
        this.getView().requestFocus();
    }
}

MainActivityでonBackPressed()をオーバーライドします

class MainActivity extends Activity{
    ...

    @Override
    public void onBackPressed() {

        if (getFragmentManager().getBackStackEntryCount() > 0) {

            getFragmentManager().popBackStack();
        } else {

            super.onBackPressed();
        }
    } 
}
于 2017-05-19T04:35:29.390 に答える
0

そうです、このトピックに関する以前の質問/ドキュメントはたくさんあります;)

フラグメントに関するドキュメント、特にトランザクションと保存状態に関するセクションは、答えにあなたを導きます。

http://developer.android.com/guide/components/fragments.html#Transactions

http://developer.android.com/guide/components/activities.html#SavingActivityState

Android-フラグメントonActivityResultはリロードを回避します

フラグメントはサポートできますが、サポートできonSaveInstanceStateませんonRestoreInstanceState。したがって、テーブルビューへの参照を保存する場合は、フラグメントをに保存すると、メソッドBundleで保存されたビューにアクセスできますonActivityCreated。Fragmentsバックスタックを使用することもできます。

このガイド/チュートリアルには、バックスタックと保持フラグメントの状態に関する非常に詳細な手順/例が含まれています。

幸運を

于 2012-12-12T23:52:42.640 に答える