2015-04-29 3 views
4

Hey je viens de mettre à jour mon application à AppCompat v22.1.0 et a obtenu cette exceptionComment définirContentView avant super.onCreate en utilisant AppCompat v22.1.0?

Caused by: java.lang.IllegalArgumentException: AppCompat does not support the current theme features 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:360) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) 

J'ai trouvé soln. https://stackoverflow.com/a/29790071/2781359

Le problème n'a toujours pas été résolu car j'appelais setContentView après super.onCreate, dans la classe ConnectionWifiEditActivity.

Lorsque j'ai changé cela, il lance NullPointerException Comment puis-je résoudre ce problème?

Caused by: java.lang.NullPointerException 
      at Client.Activity.connection.ConnectionEditActivity.onResume(ConnectionEditActivity.java:46) 
      at Client.Activity.connection.ConnectionWifiEditActivity.onResume(ConnectionWifiEditActivity.java:81) 

ConnectionWifiEditActivity

public class ConnectionWifiEditActivity extends ConnectionEditActivity implements OnClickListener 
{ 
    private ConnectionWifi connection; 
    private EditText host; 
    private EditText port; 
    Button scan; 
    ListView lv; 
    private Toolbar mToolbar; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.connectionwifiedit); 
     lv = (ListView) findViewById(android.R.id.list); 
     this.connection = (ConnectionWifi) connectionParam; 
     mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     this.host = (EditText) this.findViewById(R.id.host); 
     this.port = (EditText) this.findViewById(R.id.port); 
     SnackbarManager.show(
       Snackbar.with(getApplicationContext()) // context 
         .type(SnackbarType.MULTI_LINE) // Set is as a multi-line snackbar 
         .text(R.string.tip) // text to be displayed 
         .duration(Snackbar.SnackbarDuration.LENGTH_INDEFINITE) 
       , this); 
    } 

    public void Save(View v){ 
     this.finish(); 
    } 


    @Override 
    public void onClick(View v) 
    { 

    } 

    protected void onResume() 
    { 
     super.onResume(); 
     this.host.setText(this.connection.getHost()); 
     this.port.setText(Integer.toString(this.connection.getPort())); 
    } 

    protected void onPause() 
    { 
     super.onPause(); 

     this.connection.setHost(this.host.getText().toString()); 
     this.connection.setPort(Integer.parseInt(this.port.getText().toString())); 
    }} 

ConnectionEditActivity

public static Connection connectionParam; 

    private Connection connection; 

    private EditText name; 
    private EditText password; 

    public class ConnectionEditActivity extends AppCompatActivity implements OnClickListener 
    { 
     public static Connection connectionParam; 

     private Connection connection; 

     private Button save; 

     private EditText name; 
     private EditText password; 

     protected void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      this.connection = connectionParam; 
      this.name = (EditText) this.findViewById(R.id.name); 
      this.password = (EditText) this.findViewById(R.id.password); 

     } 

     protected void onResume() 
     { 
      super.onResume(); 
      this.name.setText(this.connection.getName()); 
      this.password.setText(this.connection.getPassword()); 
     } 

     protected void onPause() 
     { 
      super.onPause(); 
      this.connection.setName(this.name.getText().toString()); 
      this.connection.setPassword(this.password.getText().toString()); 
     } 

     public void onClick(View v) 
     { 
      if (v == this.save) 
      { 
       this.finish(); 
      } 
     } 
    } 

connexion

public abstract class Connection implements Comparable<Connection>, Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public static final int TYPE_COUNT = 2; 

    public static final int WIFI = 0; 
    public static final int BLUETOOTH = 1; 

    private String name; 
    private String password; 

    public Connection() 
    { 
     this.name = ""; 
     this.password = RemoteItConnection.DEFAULT_PASSWORD; 
    } 

    public static Connection load(SharedPreferences preferences, ConnectionList list, int position) 
    { 
     Connection connection = null; 
     int type = preferences.getInt("connection_" + position + "_type", -1); 

     switch (type) 
     { 
      case WIFI: 
       connection = ConnectionWifi.load(preferences, position); 
       break; 
      case BLUETOOTH: 
       connection = ConnectionBluetooth.load(preferences, position); 
       break; 
     } 

     connection.name = preferences.getString("connection_" + position + "_name", null); 

     connection.password = preferences.getString("connection_" + position + "_password", null); 

     return connection; 
    } 

    public void save(Editor editor, int position) 
    { 
     editor.putString("connection_" + position + "_name", this.name); 

     editor.putString("connection_" + position + "_password", this.password); 
    } 

    public abstract RemoteItConnection connect(RemoteIt application) throws IOException; 

    public abstract void edit(Context context); 

    protected void edit(Context context, Intent intent) 
    { 
     ConnectionEditActivity.connectionParam = this; 
     context.startActivity(intent); 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public String getPassword() 
    { 
     return password; 
    } 

    public void setPassword(String password) 
    { 
     this.password = password; 
    } 

    public int compareTo(Connection c) 
    { 
     return this.name.compareTo(c.name); 
    } 
} 

Répondre

12

Puisque vous souhaitez obtenir des éléments ui dans la méthode super, vous devez trouver un moyen de définir la mise en page dans la superclasse. C'est la raison parce que vous obtenez un NPE comme décrit dans les autres réponses.

Vous pouvez utiliser le setContentView() dans la superclasse, en utilisant une méthode pour renvoyer la mise en page à utiliser. De cette manière, vous pouvez remplacer la mise en page dans la sous-classe, en remplaçant la méthode.

Par exemple, vous pouvez utiliser quelque chose comme setContentView(getLayoutId()):

public class ConnectionEditActivity extends AppCompatActivity { 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(getLayoutId()); //pay attention here... 

     this.connection = connectionParam; 
     this.name = (EditText) this.findViewById(R.id.name); 
     this.password = (EditText) this.findViewById(R.id.password); 
    } 

    protected int getLayoutId(){ 
     //.... 
    } 

} 

Et vous pouvez le remplacer dans une autre activité, vous pouvez éviter la méthode setContentView.

public class ConnectionWifiEditActivity extends ConnectionEditActivity{ 

    @Override 
    protected int getLayoutId(){ 
     return R.layout.connectionwifiedit; 
    } 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     //setContentView(); //comment this line 
     //.. 
    } 

} 
2

ajoutez juste à votre style (les deux sont nécessaires)

<item name="windowActionBar">false</item> 
<item name="windowNoTitle">true</item> 

et ConnectionEditActivity vous appelez findViewById avant d'appeler setContentView il retournera toujours null. Donc, votre vue sera toujours nulle.

this.connection = connectionParam; 
this.name = (EditText) this.findViewById(R.id.name); 
this.password = (EditText) this.findViewById(R.id.password); 
+0

Cela n'a rien à voir avec le problème et votre conseil ne serait jamais correct. Vous devez absolument instancier les membres 'View's dans' onCreate', et non dans 'onStart'. –

+0

Il y a donc un problème de conception car il essaie d'instancier des membres. View AVANT d'appeler 'setContentView' et' findViewById' retournera toujours 'null'. Tous les membres seront instanciés à 'null' et ainsi dans' onResume' ils seront toujours 'null'. –

+0

Ah, vous avez raison - mes excuses pour le vote négatif. J'ai été confondu avec les noms de classe. Supprimé down-vote. –