2

내 Activity의 onCreate에서 findViewById를 사용할 때마다 NullPointerException이 발생합니다. 예를 들어 :onCreate에서 findViewById를 호출 할 때 NullPointerException이 발생했습니다.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()).commit(); 
    } 
    TextView mTextView = (TextView) findViewById(R.id.textview); 
} 

그 문제는 내가 그들을 찾으려고 내가 널 포인터를 얻을 이유가있을 때 뷰가 완전히로드되지 않을 수 있습니다 그것에 의하여 수 있음을 읽었습니다. 내 활동의 조각의 onCreateView에서 findViewById를 요구하는 경우, 모든 작동합니다 :

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, 
      false); 
    TextView mTextView = (TextView) rootView.findViewById(R.id.textview); 
} 

그러나, 나는이 조각 클래스 외부 mTextView를 사용해야합니다. findViewById가 Activity의 onCreate에서 사용되는 Android의 공식 문서에서 많은 예제를 보았습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

조각에 setContentView를 사용하고 onCreate에서 레이아웃을 조작하지 않는 것이 좋습니다. http://developer.android.com/guide/components/fragments.html –

+0

어디에서 레이아웃을 조작해야합니까? – iguarna

답변

2

레이아웃 xmls에서 textview을 레이아웃 xml-activity_main에 배치하면 해당 액티비티의 setContentView에서 찾을 수 있습니다. fragment_mainactivity_main 두 개의 서로 다른 레이아웃은 다음과 같습니다

는 현재 textview는 레이아웃 XML fragment_main

참고입니다. 앱 구조가 조각을 요구하지 않으면 전혀 필요하지 않습니다.

+0

그건 내가 놓친 것입니다. 답변 해 주셔서 감사합니다. – iguarna

+0

당신은 오신 것을 환영합니다. 받아들이십시오, upvote는 잘 작동합니다 : 많이 감사하는 것은 선택적입니다. – user2450263

1

는이 같은 시도 할 수 있습니다 -

class MainActivity extends Activity{ 
public TextView tv; 
protected void onCreate(Bundle savedInstance){ 
...... 
} 
public void doActionOnTextView() 
{ 
    //at this point you have the textview in tv 
    // do what you want to do with it 
} 
} 
class MyFragment extends Fragment{ 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
View rootView = inflater.inflate(R.layout.fragment_main, container, 
     false); 
TextView mTextView = (TextView) rootView.findViewById(R.id.textview); 
mTextView.postRunnable(new Runnable(){ 
((MainActivity)getActivity()).tv=mTextView; 
((MainActivity)getActivity()).doActionOnTextView(); 

} 
} 

아니고 최적의 솔루션을,하지만 지금은 당신을 위해 작동합니다.

관련 문제