2014-11-30 5 views
0

findFragmentByTag는 항상 null을 반환합니다. 그래서 이것을 고치고 싶습니다.findFragmentByTag does does work

나는 지원 V4와 같은 일을 시도했다, 그러나 이것은 항상 나에게 널

MainActivity 반환`

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    FragmentTransaction t = getFragmentManager().beginTransaction(); 
    ContentFragment temp = new ContentFragment(); 
    t.add(R.id.content, temp, "mine"); 

    // it does the same 
    //t.add(R.id.content, new ContentFragment(), "mine"); 
    //t.commitAllowingStateLoss(); // from supprt v4 
    t.commit(); 

    // 
    ContentFragment fragment = (ContentFragment) getFragmentManager().findFragmentByTag("mine"); 
    if (fragment == null) Log.e("ALARM", "fragment == null"); 
    else fragment.callMe(); 
    } 
} 

ContentFragment :`

public class ContentFragment extends ListFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
      inflater.getContext(), 
      android.R.layout.simple_list_item_1, 
      Environment.getRootDirectory().list()); 

    setListAdapter(adapter); 

    return super.onCreateView(inflater, container, savedInstanceState); 
} 

public void callMe(){ 
    Toast.makeText(this.getActivity().getBaseContext(), this.getTag(), Toast.LENGTH_LONG).show(); 
    } 
}` 

main.xml에

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"/> 

흔적

11-30 22:37:41.824 13491-13491/? E/Trace﹕ error opening trace file: No such file or directory (2) 
11-30 22:37:55.271 13526-13526/? E/Trace﹕ error opening trace file: No such file or directory (2) 
11-30 22:37:56.492 13569-13569/by.tq.filemanager.app E/Trace﹕ error opening trace file: No such file or directory (2) 
11-30 22:37:58.361 13569-13569/by.tq.filemanager.app E/ERR﹕ java.lang.NullPointerException 
     at by.tq.filemanager.app.MainActivity.onCreate(MainActivity.java:30) 
     at android.app.Activity.performCreate(Activity.java:5122) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1146) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2315) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403) 
     at android.app.ActivityThread.access$600(ActivityThread.java:165) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) 
     at android.os.Handler.dispatchMessage(Handler.java:107) 
     at android.os.Looper.loop(Looper.java:194) 
     at android.app.ActivityThread.main(ActivityThread.java:5370) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

보고있는 예외의 스택 추적을 게시 할 수 있습니까? –

+0

인쇄했습니다 –

+1

'FragmentTransaction.commit()'을 호출 한 직후'findFragmentByTag()'의 결과를 기대할 수 없습니다. 커밋은 처리 할 트랜잭션을 단순히 커밋하지만 즉시 적용되지는 않습니다. –

답변

1

예, 래리가 맞습니다. 바로 조각이 추가되지 않습니다. 이 활동에 연결된 후 조각에 할 일이 있다면 한가지 좋은 옵션, 오버라이드 (override) onAttach입니다 : 활동에서

public class ContentFragment extends ListFragment { 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     Toast.makeText(this.getActivity().getBaseContext(), this.getTag(), Toast.LENGTH_LONG).show(); 
    } 
} 

편집

, 나중에 findFragmentByTag를 사용하여 조각을 검색 할 수 있습니다 :

getFragmentManager().findFragmentByTag("mine"); 

주요 문제는 작업에 추가 한 직후에 조각을 가져올 수 없다는 것입니다. 조각에 액세스하는시기에 대한 질문은 라이프 사이클에서 언제 작업을해야하는지에 달려 있습니다. 사용자 입력에 응답하는 경우 해당 시간에 findFragmentByTag를 호출 할 수 있습니다. 프래그먼트를 초기화하는 경우 onAttach 또는 onCreateView를 사용할 수 있습니다. onAttach에서 액티비티로 콜백 할 수도 있습니다. 따라서 프래그먼트는 액티비티를 초기화 할 준비가되었음을 알려줍니다.

의미가 있습니까? 좀 더 자세한 내용을 말해 준다면, 나는 당신에게 더 잘 조언 할 수 있습니다.

+0

프래그먼트의 메서드에 액세스해야합니다. 아이디어가 있습니까? –

+0

나는 이해했다. 고맙습니다. –