2016-09-19 54 views
1

MainActivity CODE:如何保留原始片段的內容,而去其他片段並回到原始片段?

public class MainActivity extends AppCompatActivity implements OnColorButtonListener { 

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

    } 



    @Override 

    public void onColorClick(int color) { 

     Fragment fragment = null; 

     switch (color) { 

      case 0: 

       fragment = new RedFragment(); 

       break; 

      case 1: 

       fragment = new BlueFragment(); 

       break; 

     } 

     getSupportFragmentManager().beginTransaction() 

       .replace(R.id.fragment_ex, fragment).commit(); 

    } 

} 

RedFragment CODE:

public class RedFragment extends Fragment implements FlowerAdapter.FlowerClickListener { 



    private SwipeRefreshLayout swipeContainer_red; 

    private RecyclerView mRecyclerView; 

    private RestManager mRestManager; 

    private FlowerAdapter mFlowerAdapter; 



    @Nullable 

    @Override 

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_red, null); 

     swipeContainer_red = (SwipeRefreshLayout) view.findViewById(R.id.swipeContainer_red); 

     swipeContainer_red.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 

      @Override 

      public void onRefresh() { 

       mRestManager = new RestManager(); 

       Call<List<Flower>> listCall = mRestManager.getmFlowerApiService(getActivity()).getAllFlowers(); 

       listCall.enqueue(new Callback<List<Flower>>() { 

        @Override 

        public void onResponse(Call<List<Flower>> call, Response<List<Flower>> response) { 

         if (response.isSuccessful()) { 

          mFlowerAdapter.clear(); 

          List<Flower> flowerList = response.body(); 

          for(int i =0; i<flowerList.size(); i++) { 

           Flower flower = flowerList.get(i); 

           mFlowerAdapter.addFlower(flower); 

          } 

          swipeContainer_red.setRefreshing(false); 

         } 

        } 

        @Override 

        public void onFailure(Call<List<Flower>> call, Throwable t) { 

        } 

       }); 



      } 

     }); 

     configViews(view); 



     return view; 

    } 



    private void configViews(View view) { 

     mRecyclerView = (RecyclerView) view.findViewById(R.id.rv_flower_red); 

     mRecyclerView.setHasFixedSize(true); 

     mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 

     mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity().getApplicationContext(), 3)); 

     mFlowerAdapter = new FlowerAdapter(this); 

     mRecyclerView.setAdapter(mFlowerAdapter); 

    } 

    @Override 

    public void onClick(int position) { 

    } 

} 

當我讀到RedFragment的內容,我去藍色片段回來RedFragment,RedFragment失去了所有的內容,這是對之前的RedFragment。

我想RedFragment不會改變任何東西,而我絆倒另一個片段。

問題

我怎樣才能讓RedFragment設置不變,而我看其他片段的東西呢?

編輯// RowFragment.java

public class RowFragment extends Fragment implements View.OnClickListener { 

    private OnColorButtonListener onColorButtonListener; 
    public RowFragment() { 
    } 
    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     onColorButtonListener = (OnColorButtonListener) context; 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_row, container, false); 
     view.findViewById(R.id.v_red).setOnClickListener(this); 
     view.findViewById(R.id.v_blue).setOnClickListener(this); 
     return view; 
    } 

    @Override 
    public void onClick(View view) { 

     switch (view.getId()) { 
      case R.id.v_red: 
       onColorButtonListener.onColorClick(0); 
       break; 

      case R.id.v_blue: 
       onColorButtonListener.onColorClick(1); 
       break; 
     } 

我修改後的代碼:MainActivity的onColorClick方法

@Override 
public void onColorClick(int color) { 

    Fragment frag = null; 
    switch (color) { 
     case 0: 
      frag = getSupportFragmentManager().findFragmentByTag("red"); 
      if(frag==null){ 
       frag=new RedFragment(); 
       getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag, "red").commit(); 
      } 
      break; 
     case 1: 
      frag = getSupportFragmentManager().findFragmentByTag("blue"); 
      if(frag==null){ 
       frag=new BlueFragment(); 
       getSupportFragmentManager().beginTransaction().add(R.id.fragment_ex, frag, "blue").commit(); 
      } 
      break; 
    } 
     getSupportFragmentManager().beginTransaction().show(frag).commit(); 

    } 

但是,代碼有問題,當第一次點擊,它工作得很好,但第二次點擊相同的顏色,它不再工作。我應該怎麼做才能解決它?

+0

http://stackoverflow.com/questions/39543988/fragments-display-getting-reset閱讀本文,將解決您的問題 –

+0

您可以使用片段堆棧。 –

回答

2

相反newFragment每次的嘗試

Fragment frag=getSupportFragmentManager().findFragmentByTag(TAG); 
if(frag==null){ 
frag=new Fragment(); 
} 

,並同時加入片段指定一個標記,這樣以後就可以復出,並重新審視。

你也可以使用setRetainInstance方法和在onCreate設置的東西。

+0

對不起,我太新手來申請你的好答案。如何獲得TAG?或如何以及在哪裏設置TAG?你會讓我知道更多的提示嗎? – touchingtwist

+0

當你正在添加fragment通過TAG也替換方法。假設你有3片段,第一個標籤是「Frag_1」,第二個是「Frag_2」等等。在查找片段時也使用相同的TAG。 –

+0

請問你會檢查我的代碼(我修改的代碼:),這取決於你的教學嗎?對不起,打擾你 – touchingtwist