2011-10-17 6 views
14

두 개의 단편이있는 간단한 앱이 있는데 가로 모드 인 경우 두 단편이 나란히 표시되고 세로로 조각 A가 표시되고 옵션을 선택하면 해당 활동이 시작됩니다. 내 문제는 세로 모드에 있고 조각 B를 표시 할 때입니다. 사용자가 메뉴 옵션을 선택하면 조각 B와 관련된보기를 새로 고치거나 다시 그려보고이 작업을 수행하는 방법을 이해할 수 없습니다. getView 메소드와 getLayoutInflater 메소드를 시도했지만 새로운 뷰를 작성하고 있다고 생각하기 때문에 화면이 변경되지 않습니다. 나는 또한 프래그먼트 A에 대한 참조를 얻으려고 시도했다. 프래그먼트를 빌드하고 프래그먼트 B를 바꾸는 루틴을 호출 할 수 있지만 그것이 표시되지 않기 때문에 참조를 얻을 수 없다고 생각했다. 필자가 정말로해야 할 일은 onCreateView 메소드가 새로운 뷰를 부 풀리기 위해 다시 호출되도록 강제하는 것입니다.하지만이 메소드는 몇 가지 메소드를 시도했지만 onCreateView를 다시 호출 할 수 없습니다. 어떻게 이런 생각을 했니?Android force 재건축 단편보기

답변

1

사용자가 내가 새로 고치거나 조각 B와 연결되어이 작업 onOptionsItemSelected()에서

을 만드는 방법을 이해할 수없는보기를 다시 그려야 할 메뉴 옵션을 선택하는 경우는, 활동 호출이 새로운 컨텐츠로 위젯을 갱신하도록하는 프래그먼트의 메소드. 또는 액티비티에서 FragmentTransaction을 실행하여 조각을 바꿉니다 (원래 조각이 FragmentTransaction을 통해 설정된 경우).

(즉, 당신의 내부에 다시 ​​ onOptionsItemSelected() 전화를
9

당신은 replace() 방법

이 할 너무 열심히하지 않아야을 FragmentTransaction을 수행하고 사용하고자하지만, 대답은 당신의 메뉴의 위치에 따라 달라집니다입니다 parent 액티비티 또는 A/B 중 하나에 있습니까?).

간단하게 말해서 메뉴 구현 및 onOptionsItemSelected()이 부모 작업에 있다고 가정하고 menu_option1이 선택된 경우 조각을 변형하려고합니다. 메뉴는 (더 재사용 가능한 코드를 위해해야한다) 당신의 조각 중 하나의 자식 인 경우

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

또는 다음 하나의 방법은 호스트 활동을 필요로하는 것입니다 : 그것은 다음과 같이 보일 것입니다 Fragment에 정의 된 인터페이스를 구현하기 위해 콜백으로 사용할 수 있습니다. 그리고 프래그먼트 클래스 내의 onOptionsItemSelected() 콜백에서이 콜백 메소드를 호출하기 만하면됩니다.

한 마디처럼 들리지만 실제로는 두 가지 작업 만 수행하면됩니다. 당신이 R.id.your_fragment_id를 교체 할 때

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

것은, 당신이 XML에 선언 된 것을 가정합니다 :이, 당신은 같은 것을 볼 것이다 활동에서 그런 다음 조각 클래스

public static class FragmentA extends ListFragment { OnSelectedListener mListener; // Container Activity must implement this interface public interface OnSelectedListener { public void onSelected(); } ... @Override public void onAttach(Activity activity) { super.onAttach(activity); //This is to ensure that the Activity has implemented the interface we set up above try { mListener = (OnSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection //... switch (item.getItemId()) { case R.id.menu_option1: //do something getActivity().onSelected(); return true; case R.id.menu_option2: //do something else; return true; default: return super.onOptionsItemSelected(item); } } ... } 

것을 척 . 하지만 원래 조각이 프로그래밍 방식으로 작성된 경우 어떻게해야합니까? –

+1

@IgorGanapolsky이 조각의 컨테이너 ID입니다. – dmSherazi