【问题标题】:( Toolbar ) findViewById( R.id.tool_bar ) return NULL(工具栏)findViewById(R.id.tool_bar)返回NULL
【发布时间】:2015-11-17 11:55:04
【问题描述】:

昨天我遇到了一个问题 - findViewById( ) 为我的工具栏返回 NULL。 我环顾四周,但似乎找不到我的“大”问题的解决方案:D

这是styles.xml

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

这里是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>

这是 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 );
        }
    }

}

我尝试了很多不同的方法,但似乎都没有奏效。 提前致谢! :)

【问题讨论】:

    标签: android android-toolbar findviewbyid


    【解决方案1】:

    出于某种原因,我的 Android Studio 开始默认使用不允许我编辑布局的 CustomView。它以包含右下角的工具栏和邮件图标的主题开始。然后 mainAcitivty.java 正在寻找不再存在的工具栏和工厂。

    在 mainAcitivty.java 中替换:

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

    有了这个

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

    【讨论】:

      【解决方案2】:

      您必须将样式放在样式文件夹中。

      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>
      

      v21 文件夹中的styles.xml

       <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>
      

      【讨论】:

      • “在 v21 文件夹中”是指“values-v21”文件夹?
      【解决方案3】:

      您要在 Avtivity 中导入哪个工具栏?必须是android.support.v7.widget.Toolbar 另外,您可以尝试更改 toolbar = ( Toolbar ) drawerLayout.findViewById( R.id.tool_bar );

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

      【讨论】:

      • @Sw3das 还没有任何帮助吗?也许工具栏背景有问题?您是否在没有该参数的情况下运行了应用程序?另外,现在似乎没有人使用 fill_parent ,而是使用 match_parent 。 FILL_PARENT(在 API 级别 8 及更高版本中重命名为 MATCH_PARENT),
      • 还没有。他也没有在没有背景的情况下尝试过,尽管我真的怀疑是不是这样:/我使用的是 fill_parent,因为一旦我开始在 android 中开发,我的应用程序就会因为 LinearLayout 中的 match_parent 而崩溃。这就像你第一次做错事时的恐惧:D
      【解决方案4】:

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

      【讨论】:

      • 你的Toolbarandroid.support.v7.widget.Toolbar吗?
      【解决方案5】:

      好吧,伙计们,不知道怎么做,但通过删除toolbar.bringToFront( ); 解决了整个问题...

      感谢大家的回答!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多