【问题标题】:How to set a toolbar in a List Activity?如何在列表活动中设置工具栏?
【发布时间】:2015-11-22 17:16:36
【问题描述】:

我想更改迄今为止创建的应用程序,以实现ListView。我关注了this examplethis example。仅这些示例有效,但不能与我必须对迄今为止现有的应用程序进行的更改一起使用。

我有一个avticity_main.xml,定义如下:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity" >

    <android.support.design.widget.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"/>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_grid"

        android:useDefaultMargins="true"
        android:alignmentMode="alignBounds"
        android:columnOrderPreserved="false"

        android:columnCount="4"
        >

        <TextView
            android:text="MainTitle"
            android:textSize="32dip"
            android:layout_columnSpan="4"
            android:layout_gravity="center_horizontal"
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <ListView
            android:id="@+id/list"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
        </ListView>                            
    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

我的主要活动有以下代码:

public class MainActivity extends AppCompatActivity  {
    static final String[] MOBILE_OS =
        new String[] { "Android", "iOS", "WindowsMobile", "Blackberry"};

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

        setContentView(R.layout.activity_main);

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

        ListView list = (ListView) findViewById(R.id.list);
        list.setAdapter(new ListAdapter(this, MOBILE_OS));

代码编译正常,但没有显示列表。

【问题讨论】:

  • Any ideas? 是的:不要使用 ListActivity。使用 ActionBarActivity(或 AppCompatActivity)。只需将您的 ListView 置于正常布局中即可。
  • 您能否提供一个关于如何实现 ListView 的工作示例?也许我看错了例子!我试图在行中动态显示几个项目。我已经尝试了将近 4 个小时了...
  • 是的,你看错了例子。或者...好吧,您将一些旧技术(ListActivity/ListFragment)与一些新技术(ActionBars)混合在一起。 ListActivity 所做的只是避免onCreate() 方法中的findViewById() 部分。但是你非常有限(即:每个活动只有 1 个 ListView)
  • 可能是的!很难看出一个例子是“好”还是“不太好”。现在,代码编译但崩溃了......
  • 您忘记了findViewById() 部分吗?还是您留下了“标准”ID ("@android:id/list")?

标签: android android-activity


【解决方案1】:

ListActivity 是实现简单ListView 的“便利”类。这就是你能做的几乎所有事情。所以,那里没有setSupportActionBar(Toolbar)

要实现您想要的,请使用AppCompatActivity 或默认Activity

This link 提供了一个很好的教程,介绍如何使用新的ToolBar 而不是旧的ActionBar

你想要这样的东西:

可以使用这个布局示例:

P.S.: "@color/primary" 可以是任何颜色,例如 #FF009688

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:id="@+id/toolbar"
        android:background="@color/primary"
        android:elevation="4dp">

    </android.support.v7.widget.Toolbar>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:id="@+id/lv"></ListView>

</RelativeLayout>

在 Java 方面:

YourActivity.java

public class MainActivity extends AppCompatActivity {


    private Toolbar toolbar;
    private ListView lv;


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

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        lv = (ListView) findViewById(R.id.lv);
        setSupportActionBar(toolbar);

        final ActionBar actionBar = getSupportActionBar();

        if (actionBar != null) {
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
            actionBar.setDisplayShowTitleEnabled(false);
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        // Populate the ListView here...

    }

}

编辑: 我的This other answer 可以向您展示如何创建自定义适配器以在ListView 上显示您想要的数据。

第二次修改:使用此布局

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity" >

    <android.support.design.widget.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"/>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_grid"

        android:useDefaultMargins="true"
        android:alignmentMode="alignBounds"
        android:columnOrderPreserved="false"

        android:columnCount="4"
        android:orientation="vertical">

        <TextView
            android:text="MainTitle"
            android:textSize="32dip"
            android:layout_columnSpan="4"
            android:layout_gravity="center_horizontal"
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <ListView
            android:id="@+id/list"
            android:layout_height="wrap_content"
            android:layout_width="match_parent">
        </ListView>
    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

我做了什么?

您的 LinearLayout 在 XML 中缺少 orientation 参数,而您的 TextViewandroid:layout_height 设置为 match_parent,因此它填充了整个布局。我已将其更改为 wrap_content,您可以开始了。

【讨论】:

  • 但是如何在该活动中包含一个 ListView 和一个工具栏?
  • 我想要你发布的内容,但实际上每一行都包含多个项目:一个名字、一个数字、一个数字、一个可点击的小图标...
  • 也许我又需要一些完全不同的东西?
  • 我的代码原则上和你的例子一样。请查看我上面的活动 xml...
  • 您必须为您的ListView 创建一个自定义适配器才能显示这样的内容。检查有关如何执行此操作的链接答案,并且不要使用 ListViewActivity ;)
【解决方案2】:

setSupportActionBar(toolbar) 在 ListActivity 中不可用。您可以改用 AppCompatActivity 并获取对列表视图的引用: ListView 列表 = findViewById(R.id.list);并使用 list.setAdapter(adapter) 而不是 setListAdapter(adapter);

【讨论】:

  • 我以前用过AppCompatActivity!但是如何拥有 ListView 呢?
  • ListView 列表 = findViewById(R.id.list);并使用 list.setAdapter(adapter) 而不是 setListAdapter(adapter);
  • 嗯,代码编译并不会崩溃,但我没有看到项目列表。可能是布局 xml 文件有问题?
【解决方案3】:

你不能在 ListActivity 中这样做。

如果你想访问 getSupportActionBar(),你需要通过 AppCompatActivity 扩展你的类。

我的建议:不要使用 ListActivty 是你想使用 ToolBar。创建一个 Activity,然后在该 Activity 中只有 ListView。它会工作得很好。

【讨论】:

    【解决方案4】:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    
    // Set an OnMenuItemClickListener to handle menu item clicks
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // Handle the menu item
            return true;
        }
    });
    
    // Inflate a menu to be displayed in the toolbar
    toolbar.inflateMenu(R.menu.your_toolbar_menu);
    

    }`

    【讨论】:

      【解决方案5】:

      您可以使用支持库提供的新的AppCompatDelegate 组件轻松地将工具栏添加到您的 ListActivity。

      点击此链接,

      How to add Toolbar to an Activity which doesn't extend AppCompatActivity

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多