2012-03-24 6 views
19

나는 안드로이드에서 단편을 배우려고 노력하고 있는데, 여러 가지 예를 들어 보니 여러 가지 방법이있을 것 같았고 올바른 방법 또는 적어도 상황에 따라 한 가지 방법으로 조언을 얻고 싶었습니다. 다른 것보다 사용해야합니다.Android Fragments는 조각을 다시 사용하거나 새 인스턴스를 만들어야하나요?

하나의 예는 조각과 FrameLayout을 포함하는 레이아웃을 만들었습니다. 코드에서 ListFragment에서 항목을 선택하면 생성자에서 필요한 일부 데이터가있는 새 조각이 만들어지고 FrameLayout은 FragmentTransaction.replace()를 사용하여이 새 조각으로 바뀝니다.

또 다른 예는 2 개의 프래그먼트를 나란히 배치하는 레이아웃 파일을 가지고 있습니다. 이제 코드에서 사용자가 하나의 조각에서 목록의 항목을 선택하면 데이터를 업데이트하기 위해 (선택한 항목을 기반으로) 다른 조각으로 전화가 걸립니다.

그래서 나는이 방법들 중 하나가 다른 것보다 선호되는지, 아니면 특정 상황을 사용해야하는지 궁금하다.

편집 :

1 :

 mCurCheckPosition = index; 

     if (mDualPane) { 
      // We can display everything in-place with fragments, so update 
      // the list to highlight the selected item and show the data. 
      getListView().setItemChecked(index, true); 

      // Check what fragment is currently shown, replace if needed. 
      DetailsFragment details = (DetailsFragment) 
        getFragmentManager().findFragmentById(R.id.details); 
      if (details == null || details.getShownIndex() != index) { 
       // Make new fragment to show this selection. 
       details = DetailsFragment.newInstance(index); 

       // Execute a transaction, replacing any existing fragment 
       // with this one inside the frame. 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.details, details); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
      } 

     } else { 
      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), DetailsActivity.class); 
      intent.putExtra("index", index); 
      startActivity(intent); 
     } 

2 : 그래서

public void onListItemClick(ListView l, View v, int position, long id) { 
    String item = (String) getListAdapter().getItem(position); 
    DetailFragment fragment = (DetailFragment) getFragmentManager() 
      .findFragmentById(R.id.detailFragment); 
    if (fragment != null && fragment.isInLayout()) { 
     fragment.setText(item); 
    } else { 
     Intent intent = new Intent(getActivity().getApplicationContext(), 
       DetailActivity.class); 
     intent.putExtra("value", item); 
     startActivity(intent); 

    } 

} 

답변

20

난 그냥 궁금 여기에 내가 언급 한 두 가지 방법 각각에 대한 코드는 이 방법들 중 하나가 다른 것보다 선호되거나 특정 환경이 사용되어야하는 경우?

실제 조각을 변경할 필요가없는 경우 (즉, 동일한 조각 클래스 인 경우), 해당 조각을 대체하지 않고 해당 조각에 대한 작업을 호출해야합니다 (시나리오 # 2). 존재합니다. 런타임시 비용이 훨씬 적게 들며 코드 작성도 더 간단합니다.

그러나 조각이 다른 항목이어야하는 경우 (예 : 클릭 한 항목에 따라 목록에 표시된 모델 개체의 다른 유형에 다른 조각이있을 수 있음) 조각을 교체해야합니다 (시나리오 # 1). 조각 이 발생하면이 이벤트가 동일한 클래스가되도록이 발생하는 경우를 최적화 할 수 있습니다. 단, 조각을 대체하여 문제를 해결하고 시간과 경향이있는 경우 최적화에 대해 먼저 집중해야합니다. .

구조적으로 # 2 코드의 팬이 아닙니다. IMHO, 단편은 다른 단편과 직접 이야기하면 안됩니다. 내가 선호하는 패턴은 파편이 "자신의 위젯과 모델에있는 것"에만 초점을 맞추고 "뜨개질에 집착"하는 것입니다. UI의 다른 부분 (예 : 목록 클릭)에 영향을 미치는 이벤트의 경우 조각에 작업을 알립니다 (예 : 수신기 인터페이스를 통해). 활동은 처음에 그 (것)들을 창조 한 것이기 때문에, 어느 조각이 주위에 있어야하는지 알고있는 것이다. 그런 다음 활동은 다른 단편 (존재하는 경우)과 통화하거나, 다른 단편 (공간이있는 경우)을 작성하거나 다른 활동을 시작할 수 있습니다. # 2 접근 방식을 선호하는 경우, 사용하실 수 있습니다 - 귀하의 상황에서 내가하는 일은 아닙니다.

관련 문제