martedì 8 aprile 2014

NullPointerException su OnCreate di Android

Per molto tempo sono stato abituato a dichiarare i widget di Android direttamente nella funzione OnCreate con una sintassi di questo tipo


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

Button cerca = (Button) findViewById(R.id.button1); 
cerca.setOnClickListener(new OnClickListener(){ 
                      public void onClick(View v) { 
                             //fai qualcosa
                        } 
                    });
 }
-------------------------------------------

con le nuove modifiche questa sintassi crea un NullPointerException (senza molte altre spiegazioni)
Adesso invece si le dichiarazioni devono essere spostati in OnCreateView()
--------------------------------------------
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,false);
msg = (TextView) rootView.findViewById(R.id.textView1);
Button cerca= (Button) rootView.findViewById(R.id.button1);
cerca.setOnClickListener(new View.OnClickListener() {
          public void onClick(View view) {
               //fai qualcosa;
          }
       });
return rootView;
}
--------------------------------------------
Per rendere visibile a tutto il programma la TextView si puo' dichiarare come static nella MainActivity

--------------------------------------------
public class MainActivity extends ActionBarActivity {
private static TextView rssi_msg;
--------------------------------------------

Un altro aspetto che e' cambiato nel modo di programmare Android e' la presenza di due file di layout (ovvero il classico activity_main.xml e fragment_main.xml). I componenti visivi devono essere posti su fragment_main.xml

Per cambiare il tema dell'applicazione si puo' modificare il file AndroidManifest.xml come
--------------------------------------------
        <activity
            android:name="com.luca.innocenti.bttester.MainActivity"
            android:label="@string/app_name" 
            android:theme="@style/Theme.AppCompat">