Java不支持多继承,如何在AppCompatActivity中实现ActionBar与ListView?
解决AppCompatActivity中使用ListView的问题
嗨,很高兴能帮到你!你遇到的问题其实很典型——因为getListView()是ListActivity类的专属方法,而你的EmergencyContactsActivity继承的是AppCompatActivity。Java确实不支持多继承,所以没法同时继承这两个类,但我们完全可以用其他方式实现需求,不需要纠结多继承的限制。
下面给你两种可行的解决方案,更推荐第一种:
方案一:在布局中添加ListView控件(推荐)
这种方式最灵活,完全适配AppCompatActivity的特性,步骤如下:
- 修改布局文件:在
activity_emergency_contacts.xml里添加一个ListView控件,和你的Toolbar放在一起:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/actionBar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"/> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
- 修改Java代码:把原来的
getListView()换成通过findViewById()获取ListView实例:
public class EmergencyContactsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_emergency_contacts); Toolbar toolbar = findViewById(R.id.actionBar); setSupportActionBar(toolbar); ActionBar ab = getSupportActionBar(); ab.setDisplayHomeAsUpEnabled(true); String [] contacts = {"XX Gas Emergency Service", "XXFire Service", "Council"}; // 获取布局中的ListView实例 ListView listView = findViewById(R.id.listView); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contacts); listView.setAdapter(adapter); } }
这样修改后,既保留了AppCompatActivity的ActionBar功能,又能正常使用ListView,完全避开了多继承的问题。
方案二:使用ListActivity(不推荐)
如果你一定要用ListActivity的内置特性,也可以这么做,但ListActivity是比较老旧的组件,对Material Design的支持不如AppCompatActivity友好:
- 修改布局文件:确保ListView的id为
android:id/list(ListActivity默认会识别这个id):
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/actionBar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"/> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
- 修改Java代码:让Activity继承
ListActivity,并使用setActionBar()设置Toolbar:
public class EmergencyContactsActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_emergency_contacts); Toolbar toolbar = findViewById(R.id.actionBar); setActionBar(toolbar); ActionBar ab = getActionBar(); ab.setDisplayHomeAsUpEnabled(true); String [] contacts = {"XX Gas Emergency Service", "XXFire Service", "Council"}; // 使用ListActivity的setListAdapter方法设置适配器 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contacts); setListAdapter(adapter); } }
不过还是强烈推荐第一种方案,因为AppCompatActivity能提供更好的兼容性和更多的UI特性,适合现代Android开发。
内容的提问来源于stack exchange,提问作者Face Value
相关产品推荐
相关产品推荐

