2015-08-24 22 views
6

Ieri ho riscontrato un problema: findViewById() restituisce NULL per la barra degli strumenti. Stavo guardando intorno attraverso l'interner ma sembra non riesco a trovare la soluzione per il mio problema "BIG": D(barra degli strumenti) findViewById (R.id.tool_bar) return NULL

Ecco lo styles.xml

<resources> 
    <style name = "AppTheme" parent = "@style/Theme.AppCompat.NoActionBar"> 
     <!-- TODO: Create AppTheme --> 
     <item name="android:windowActionBar">false</item> 
    </style> 
</resources> 

Ecco l'activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.widget.DrawerLayout 
    xmlns:android = "http://schemas.android.com/apk/res/android" 
    xmlns:tools = "http://schemas.android.com/tools" 
    android:id = "@+id/drawer_layout" 
    android:layout_width = "match_parent" 
    android:layout_height = "match_parent" 
    tools:context = ".Main" > 

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

     <android.support.v7.widget.Toolbar 
      android:id="@+id/tool_bar" 
      android:layout_width = "fill_parent" 
      android:layout_height = "@dimen/toolbar_height" 
      android:background = "@mipmap/bg_toolbar" > 

      <ImageView 
       android:id = "@+id/toolbar_drawer_button" 
       android:clickable="true" 
       android:layout_width = "wrap_content" 
       android:layout_height = "@dimen/toolbar_height" 
       android:src = "@mipmap/ic_drawer" /> 

      <TextView 
       android:id = "@+id/toolbar_title" 
       android:layout_width = "wrap_content" 
       android:layout_height = "wrap_content" 
       android:layout_gravity = "center" 
       android:text = "@string/app_name" 
       android:textColor = "@color/toolbar_text" 
       android:textSize = "@dimen/toolbar_text_size" 
       android:textStyle = "bold|italic" /> 

      <ImageView 
       android:id = "@+id/toolbar_settings" 
       android:clickable="true" 
       android:layout_width = "wrap_content" 
       android:layout_height = "@dimen/toolbar_height" 
       android:layout_gravity = "right" 
       android:background = "@android:color/transparent" 
       android:padding = "8dp" 
       android:src = "@mipmap/ic_settings" /> 
     </android.support.v7.widget.Toolbar> 

     <FrameLayout 
      android:id = "@+id/view_container" 
      android:background="@mipmap/bg_main" 
      android:layout_width = "match_parent" 
      android:layout_height = "match_parent" /> 

    </LinearLayout> 


    <ListView 
     android:id = "@+id/drawer" 
     android:layout_width = "@dimen/drawer_width" 
     android:layout_height = "match_parent" 
     android:layout_gravity = "left" 
     android:gravity = "center_vertical" 
     android:background = "@mipmap/bg_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

Ed ecco la Main.java:

public class Main extends AppCompatActivity 
{ 
    private DrawerAdapter   drawerAdapter; 
    private String[]    drawerTitles; 
    private DrawerLayout   drawerLayout; 
    private ArrayList<DrawerItem> drawerItems; 
    private TypedArray    drawerIcons; 
    private ListView    drawerList; 
    private Toolbar     toolbar; 
    private ImageView    drawerButton; 
    private LayoutInflater   lInflater; 
    private FrameLayout    view_container; 
    private Converter    converter; 

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

     lInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); 

     /** Identifying views **/ 
     view_container = (FrameLayout) findViewById(R.id.view_container); 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawerList = (ListView) findViewById(R.id.drawer); 
     drawerItems = new ArrayList<>(); 

     toolbar = (Toolbar) drawerLayout.findViewById(R.id.tool_bar); 

     /** Setting toolbar as action bar **/ 
     SetupToolbar(); 

     /** Getting resources **/ 
     drawerTitles = getResources().getStringArray(R.array.drawer_categories); 
     drawerIcons = getResources().obtainTypedArray(R.array.drawer_icons); 

     /** Filling drawer with items (rows) **/ 
     for(int i = 0; i < drawerTitles.length; i++) 
      drawerItems.add(new DrawerItem(drawerTitles[ i ], drawerIcons.getResourceId(i, -1))); 

     /** Clearing icon array **/ 
     drawerIcons.recycle(); 

     /** Setting drawer adapter **/ 
     drawerAdapter = new DrawerAdapter(getApplicationContext(), drawerItems); 
     drawerList.setAdapter(drawerAdapter); 

     /** Making drawer items selectable **/ 
     drawerList.setOnItemClickListener(new DrawerItemClickListener()); 
    } 

    private void SetupToolbar() 
    { 
     toolbar.bringToFront(); 

     if(toolbar != null) 
     { 
      setSupportActionBar(toolbar); 
      setTitle(null); 

      drawerButton = (ImageView) findViewById(R.id.toolbar_drawer_button); 

      if(drawerButton != null) 
      { 
       drawerButton.setOnClickListener(new View.OnClickListener() 
       { 
        @Override public void onClick(View v) 
        { 
         if(drawerLayout.isDrawerOpen(drawerList)) 
          drawerLayout.closeDrawer(drawerList); 

         else 
          drawerLayout.openDrawer(drawerList); 
        } 
       }); 
      } 

     } 
    } 

    public class DrawerItemClickListener implements AdapterView.OnItemClickListener 
    { 
     @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      view_container.removeAllViews(); 

      switch(position) 
      { 
       case 0: 
        lInflater.inflate(R.layout.fragment_distance, view_container); 
        break; 

       case 1: 
        lInflater.inflate(R.layout.fragment_volume, view_container); 
        break; 

       default: 
        Toast.makeText(getApplicationContext(), "NOT YET READY !!!", Toast.LENGTH_SHORT).show(); 
        break; 
      } 

      drawerLayout.closeDrawer(drawerList); 
     } 
    } 

} 

ho provato un sacco di cose diverse ma nessuno di loro sembrava funzionare. Grazie in anticipo! :)

risposta

0

Ok ragazzi, non so come, ma il tutto è stato risolto eliminando toolbar.bringToFront(); ...

Grazie a tutti per le vostre risposte!

1

devi mettere lo stile nella cartella di stile.

styles.xml

<!-- Base application theme. --> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <!-- Customize your theme here. --> 
    </style> 

    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 

     <item name="colorAccent">@color/colorAccent</item> 
</style> 

styles.xml nella cartella v21

<style name="AppTheme" parent="AppTheme.Base"> 

     <item name="android:windowContentTransitions">true</item> 
     <item name="android:windowAllowEnterTransitionOverlap">true</item> 
     <item name="android:windowAllowReturnTransitionOverlap">true</item> 
     <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
     <item name="android:windowSharedElementExitTransition">@android:transition/move</item> 

     <item name="android:textColorPrimary">@color/textColorPrimary</item> 
     <item name="android:windowBackground">@color/windowBackground</item> 
     <item name="android:navigationBarColor">@color/navigationBarColor</item> 

    </style> 
+0

da "nella cartella v21" intendi cartella "valori-V21"? – Sw3das

+0

sì valori-v21. –

+0

scusate, questo non ha funzionato:/ – Sw3das

0

Quale barra degli strumenti stai importando nel vostro Avtivity? Essa deve essere android.support.v7.widget.Toolbar Inoltre, si può provare a cambiare toolbar = (Toolbar) drawerLayout.findViewById(R.id.tool_bar); a

toolbar = (Toolbar) findViewById(R.id.tool_bar); 
+0

è il V7 uno – Sw3das

+0

@ Sw3das nulla era stato ancora aiutato? Forse c'è un problema con lo sfondo della barra degli strumenti? Hai eseguito app senza quel parametro? Inoltre, sembra che nessuno stia usando fill_parent ora, usa invece match_parent. FILL_PARENT (rinominato MATCH_PARENT in API Livello 8 e successive), –

+0

non ancora. Non ho nemmeno provato il retroscena, anche se dubito davvero che sia il caso:/ Sto usando fill_parent perché una volta che ho iniziato a sviluppare in Android, la mia app si è bloccata a causa di match_parent in LinearLayout. È come la paura quando fai qualcosa di sbagliato per la prima volta: D – Sw3das

0

Change toolbar = (Toolbar) drawerLayout.findViewById(R.id.tool_bar); in .

+0

che è stato il mio primo tentativo, non ha funzionato:/ – Sw3das

+0

È il tuo 'Toolbar' a' android.support.v7.widget.Toolbar'? – SilentKnight

+0

sì, è android.support.v7.widget.Toolbar – Sw3das

2

Il mio Android Studio, per qualche motivo, ha iniziato a impostare come predefinito un CustomView che non mi permetteva di modificare il layout. Si inizia con un tema che include una barra degli strumenti e un'icona della posta in basso a destra. mainAcitivty.java sta quindi cercando quella toolbar e Fab, che non è più lì.

in mainAcitivty.java REPLACE:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
} 

con questo

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