2014-02-12 26 views
12

我是Android開發人員和Android Studio的新手,請原諒我的無知。按鈕button = findViewById(R.id.button)在Android Studio中始終解析爲null

findViewById我添加的按鈕始終解決爲null。因此,如果我嘗試setonClickListener它會使整個活動失敗。

MainActivity:

public class MainActivity extends ActionBarActivity { 

    @Override 
    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(); 
     } 

     Button buttonClick = (Button) findViewById(R.id.button); 
     buttonClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       onButtonClick((Button) view); 
      } 

     }); 

    } 

    public void onButtonClick(Button view) { 
     TextView textHello = (TextView) findViewById(R.id.textView); 
     textHello.setText("Clicked !!!"); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * 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); 
      return rootView; 
     } 
    } 

} 

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.pluralsight.activitylifecycle.MainActivity" 
tools:ignore="MergeRootFrame" /> 

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.pluralsight.activitylifecycle.MainActivity$PlaceholderFragment"> 

<TextView 
    android:text="@string/hello_world" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/textView" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/buttonClick" 
    android:id="@+id/button" 
    android:layout_below="@+id/textView" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:layout_marginRight="54dp" /> 

</RelativeLayout> 
+0

http://stackoverflow.com/questions/21323531/tabhost-setup-gives-null-pointer-exception-android-studio/21324579#21324579的重複 – pyus13

回答

26

這是因爲findViewById()搜索activity_main佈局,而按鈕位於片段的佈局fragment_main

移動,在片段的onCreateView()方法的代碼:

//... 

View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
Button buttonClick = (Button)rootView.findViewById(R.id.button); 
buttonClick.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     onButtonClick((Button) view); 
    } 
}); 

注意,現在你訪問它通過rootView觀點:

Button buttonClick = (Button)rootView.findViewById(R.id.button); 

否則你將再次得到NullPointerException異常。

0

R.id.button不是R.layout.activity_main的一部分。活動應該如何在內容視圖中找到它?

Fragment顯示包含該按鈕的佈局,因此您必須在Fragment中獲取Button。

1

該按鈕代碼應該移動到PlaceholderFragment()類。在那裏您將調用onCreateView方法中的佈局fragment_main.xml。像這樣

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_main, container, false); 
    Button buttonClick = (Button) view.findViewById(R.id.button); 
    buttonClick.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      onButtonClick((Button) view); 
     } 

    }); 

    return view; 
} 
相關問題