java - 如何将 ListActivity 转换为 AppCompatActivity
问题描述
我想将我的活动父级从 ListActivity 更改为 AppCompatActivity,因为我需要使用授予的检查权限并且它需要 AppCompat,但我的活动是 ListView。我尝试了这个动作,但没有收到好的结果:(
这是我的源代码(Ever has ... 没有添加代码):
public class RingtoneSelectActivity extends ListActivity {
...
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mShowAll = false;
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
showFinalAlert(getResources().getText(R.string.err_sdcard_readonly));
return;
}
if (status.equals(Environment.MEDIA_SHARED)) {
showFinalAlert(getResources().getText(R.string.err_sdcard_shared));
return;
}
if (!status.equals(Environment.MEDIA_MOUNTED)) {
showFinalAlert(getResources().getText(R.string.err_no_sdcard));
return;
}
Intent intent = getIntent();
mWasGetContentIntent = intent.getAction().equals(
Intent.ACTION_GET_CONTENT);
// Inflate our UI from its XML layout description.
setContentView(R.layout.media_select);
SplashHandler mHandler = new SplashHandler();
Message msg = new Message();
//Assign a unique code to the message.
//Later, this code will be used to identify the message in Handler class.
msg.what = 0;
// Send the message with a delay of 3 seconds(3000 = 3 sec).
mHandler.sendMessageDelayed(msg, 10000);
try {
mAdapter = new SimpleCursorAdapter(
this,
// Use a template that displays a text view
R.layout.media_select_row,
// Give the cursor to the list adatper
createCursor(""),
// Map from database columns...
new String[]{
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media._ID},
// To widget ids in the row layout...
new int[]{
R.id.row_artist,
R.id.row_album,
R.id.row_title,
R.id.row_icon,
R.id.row_options_button});
setListAdapter(mAdapter);
getListView().setItemsCanFocus(true);
// Normal click - open the editor
getListView().setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent,
View view,
int position,
long id) {
startRingdroidEditor();
}
});
} catch (SecurityException e) {
// No permission to retrieve audio?
Log.e("Ringtone", e.toString());
// todo error 1
} catch (IllegalArgumentException e) {
// No permission to retrieve audio?
Log.e("Ringtone", e.toString());
// todo error 2
}
mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view,
Cursor cursor,
int columnIndex) {
if (view.getId() == R.id.row_options_button) {
// Get the arrow image view and set the onClickListener to open the context menu.
ImageView iv = (ImageView) view;
iv.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openContextMenu(v);
}
});
return true;
} else if (view.getId() == R.id.row_icon) {
setSoundIconFromCursor((ImageView) view, cursor);
return true;
}
return false;
}
});
// Long-press opens a context menu
registerForContextMenu(getListView());
}
}
...
}
我改成这样:
public class RingtoneSelectActivity extends AppCompatActivity {
但是我在这行中收到了一些错误:
...
setListAdapter(mAdapter);
getListView().setItemsCanFocus(true);
getListView().setOnItemClickListener(new OnItemClickListener() { ... });
...
registerForContextMenu(getListView());
我的错误:
- 无法解析方法'setListAdapter(android.widget.SimpleCursorAdapter)
- 无法解析方法“getListView()”
我该如何解决这些错误?
[编辑]
我的日志猫:
E/ACRA: ACRA caught a NullPointerException for ir.ari.mp3cutter
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SimpleCursorAdapter.changeCursor(android.database.Cursor)' on a null object reference
at ir.ari.mp3cutter.RingtoneSelectActivity.refreshListView(RingtoneSelectActivity.java:621)
at ir.ari.mp3cutter.RingtoneSelectActivity.onOptionsItemSelected(RingtoneSelectActivity.java:314)
at android.app.Activity.onMenuItemSelected(Activity.java:2908)
at com.android.internal.policy.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1151)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:200)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
at android.widget.AbsListView$3.run(AbsListView.java:3879)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
第 304 至 319 行:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_about:
RingtoneEditActivity.onAbout(this);
return true;
case R.id.action_record:
onRecord();
return true;
case R.id.action_show_all_audio:
mShowAll = true;
refreshListView();
return true;
default:
return false;
}
}
第 619 至 622 行:
private void refreshListView() {
String filterStr = mFilter.getQuery().toString();
mAdapter.changeCursor(createCursor(filterStr));
}
[注意:我很抱歉我说得不好,因为我的英语学得不好:)
解决方案
所以不要更改超类,只需检查未授予的权限ContextCompat.checkSelfPermission()
,然后请求权限ActivityCompat.requestPermissions()
并获取结果:
@Override
public void onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
推荐阅读
- batch-file - 如何将空标记保留在for循环中
- javascript - 使用计时器处理连续的承诺
- android - Android PWA - 如何防止在应用程序之间切换后重新加载?
- python - 在 spacy 的帮助下合并几乎相似的行
- c# - 在表达式中模拟动态属性,用于 Bogus
- apache-kafka - 是否指定了 Kafka Streams 拓扑的处理顺序?
- docker - bitbake 错误:PermissionError:[Errno 1] 不允许操作:更改文件系统上的所有者组时
- python - 使用订阅后如何从df表中获取pandas的价值
- swift - Firebase Auth with MongoDB Stitch Custom Auth:如何将用户信息从 Firebase 传递到 MongoDB
- react-native - TypeError: undefined is not a function (near '...(0,_reactNavigationStack.createDrawerNavigator)