2014-02-12 2 views
2

간단한 Android 앱이 있습니다. layout 폴더에는 activity_main.xml 파일과 fragment_main.xml 파일이 표시됩니다. 해당 fragments.xml 파일에서 buttonTest라는 버튼을 배치했습니다. 내가 그 buttonTest에 대한 액세스 권한을 얻기 위해 노력하고있어 MainActivity.java 파일에 ANDROID STUDIO fragment_main.xml의 개체에 액세스 할 수 없습니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="com.snapvest.thunderbird.app.MainActivity$PlaceholderFragment"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="TEST" 
     android:id="@+id/buttonTest" 
     android:layout_gravity="center_horizontal" /> 
</LinearLayout> 
.

public class MainActivity extends Activity { 

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

    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()) 
       .commit(); 
    } 

    // Get access to the buttons 
    final Button buttonTest = (Button)findViewById(R.id.buttonTest); 
} 

그것은 잘 컴파일합니다. 하지만 그것을 실행하면 buttonTest 변수가 null 포인터로 돌아옵니다. buttonTest 객체를 찾지 못하는 이유는 무엇입니까?

답변

1

findViewById() 버튼을 찾기 위해 실패 이유는 findViewById() 만에 setContentView() 소수 당신이 setContentView()에게 준 layout.xml 파일에 보이기 때문에, 그리고 당신의 버튼 R.layout.activity_main에 위치하지 않습니다. 버튼이 Fragment (있는 것으로 보이는)에 있으면 Activity이 아닌 Fragment에서 액세스하고 조작해야합니다. 이렇게하면 ActivityFragment 로직이 분리 된 채로 유지되어 다른 ActivitiesFragment을 다시 사용할 수 있습니다.

+0

activity_main.xml과 fragment_main.xml은 모두 레이아웃 폴더에 있습니다. 처음 Android Studio를 시작하고 이것을 새로운 앱으로 추가하면 액티비티와 프래그먼트 xml 파일이 자동으로 생성되며 초기 편집을 위해 fragment_main.xml을 강조 표시 (자동 선택)합니다. 그 말은 저에게 내 레이아웃은 실제로는 activity_main.xml이 아닌 fragment_main.xml에 있어야한다는 것입니다. 어디에서 버튼에 액세스해야하는지에 관해서는 MainActivity.java 파일이 있지만 그 프래그먼트에 명시 적으로 일치하는 것은 없습니다. 사실, MainActivity.java는 유일한 자바 파일입니다. –

+0

내가 setContentView (R.layout.activity_main)를 변경하면; setContentView (R.layout.fragment_main);로 설정합니다. [즉 FRAGMENT]에 다음 실제로 단추에 액세스 할 수 및 null이 아닌 포인터를 가져옵니다. 그러나 그때 app은 "유감스럽게도, SnapVest가 작동을 멈췄다"고보고합니다. –

6

해결책을 찾은 것 같습니다. MainActivity.java는 activity_main.xml을 설정 한 다음 fragment_main.xml을 (초기) 단일 기본 프래그먼트로 사용합니다. 그래서 우리는 기본적으로 activity에 대한 모든 UI를 fragment_main.xml에 실제로 넣어야합니다 (실제로는 NOTHING을 activity_main.xml에 넣어야합니다).

MainActivity.java의 맨 아래에는 fragment_main.xml을 초기화하는 섹션이 있습니다. 그리고 프래그먼트에 대한 UI의 버튼과 다른 객체에 액세스해야합니다. 예 :

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

     // Get access to the buttons 
     final Button buttonAvailableOptions = (Button)rootView.findViewById(R.id.buttonAvailableOptions); 

     return rootView; 
    } 
} 

대부분이 Android Studio에서 자동으로 추가됩니다. "버튼에 액세스"로 시작하는 부분은 내 것이며 버튼 및 기타 UI 객체에 대한 액세스 또는 처리를 설정하는 부분입니다.

+0

답변을 찾았습니다. http://stackoverflow.com/questions/23653778/nullpointerexception-accessing-views-in-oncreate – cabaji99