【问题标题】:error: cannot access ActionBarActivity class file for android.support.v7.app.ActionBarActivity not found错误:无法访问 android.support.v7.app.ActionBarActivity 的 ActionBarActivity 类文件未找到
【发布时间】:2019-05-24 00:46:50
【问题描述】:
package com.infonium.password.ui.activities;


import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatCallback;
import android.support.v7.app.AppCompatDialog;
import android.support.v7.app.ActionBar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;

import com.infonium.password.events.CryptoEvent;
import com.infonium.password.events.DBExportEvent;
import com.infonium.password.runnable.DBExportRunnable;
import com.infonium.password.utils.AppConstants;
import com.infonium.password.utils.ResUtil;
import com.infonium.password.utils.UserDefault;
import com.kenumir.materialsettings.MaterialSettings;
import com.kenumir.materialsettings.items.CheckboxItem;
import com.kenumir.materialsettings.items.HeaderItem;
import com.kenumir.materialsettings.items.SwitcherItem;
import com.kenumir.materialsettings.items.TextItem;
import com.kenumir.materialsettings.storage.StorageInterface;

import de.greenrobot.event.EventBus;
import com.infonium.password.R;
import com.infonium.password.adapters.SettingsSpinnerAdapter;
import com.infonium.password.db.Account;
import com.infonium.password.db.AccountHelper;
import com.infonium.password.events.CryptoEvent;
import com.infonium.password.events.DBExportEvent;
import com.infonium.password.runnable.ChangePasswordRunnable;
import com.infonium.password.runnable.DBExportRunnable;
import com.infonium.password.ui.views.SelectorItem;
import com.infonium.password.utils.AppConstants;
import com.infonium.password.utils.CryptoUtil;
import com.infonium.password.utils.ResUtil;
import com.infonium.password.utils.UserDefault;

import static android.os.Build.VERSION_CODES.M;
import android.support.v7.widget.Toolbar;


/**
 * Created by bob.sun on 16/6/21.
 */
public class SettingsActivity extends MaterialSettings {

    public static final int RequestCodeSetMainPassword = 0x700;
    private TextItem quickSwitcher;
    private SelectorItem selectorItem;
    private AppCompatDialog dialog;
    private boolean didClickedChangeMaster;
    private MaterialSettings ms;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle(R.string.settings);

        //ms = new MaterialSettings(this);

        EventBus.getDefault().register(this);

        addItem(new HeaderItem(this).setTitle(getString(R.string.security)));
        addItem(new CheckboxItem(this, UserDefault.kNeedPasswordWhenLaunch).setTitle(getString(R.string.need_password_when_launch)).setOnCheckedChangeListener(new CheckboxItem.OnCheckedChangeListener() {
            @Override
            public void onCheckedChange(CheckboxItem cbi, boolean isChecked) {
                UserDefault.getInstance(null).setNeedPasswordWhenLaunch(isChecked);
            }
        }));

        String title = UserDefault.getInstance(null).hasQuickPassword() ? getString(R.string.disable_gesture_lock) : getString(R.string.enable_gesture_lock);

        quickSwitcher = new TextItem(this, "quick_pass").setTitle(title).setOnclick(new TextItem.OnClickListener() {
            @Override
            public void onClick(TextItem textItem) {
                if (UserDefault.getInstance(null).hasQuickPassword()) {
                    UserDefault.getInstance(null).clearQuickPassword();
                    quickSwitcher.updateTitle(getString(R.string.enable_gesture_lock));
                } else {
                    Intent intent = new Intent(SettingsActivity.this, SetQuickPasswordActivity.class);
                    intent.putExtra("type", SetQuickPasswordActivity.ShowTypeSet);
                    startActivityForResult(intent, RequestCodeSetMainPassword);
                }
            }
        });
        addItem(quickSwitcher);

        didClickedChangeMaster = false;
        addItem(new TextItem(this, "change_password").setTitle(getString(R.string.change_master_password)).setOnclick(new TextItem.OnClickListener() {
            @Override
            public void onClick(TextItem textItem) {
                didClickedChangeMaster = true;
                startActivity(new Intent(SettingsActivity.this, AuthorizeActivity.class));
            }
        }));


        addItem(new HeaderItem(this).setTitle(getString(R.string.puff_secure_keyboard)));
        addItem(new TextItem(this, "ime").setTitle(getString(R.string.enable_puff_secure_keyboard)). setOnclick(new TextItem.OnClickListener() {
            @Override
            public void onClick(TextItem textItem) {
                startActivity(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS));
                Toast.makeText(SettingsActivity.this, getString(R.string.please_enable_puf_ime), Toast.LENGTH_LONG).show();
            }
        }));


        addItem(new HeaderItem(this).setTitle(getString(R.string.database)));
        addItem(new TextItem(this, "database").setTitle(getString(R.string.export_database))
                .setSubtitle(getString(com.infonium.password.R.string.database_file_can_be_used))
                .setOnclick(new TextItem.OnClickListener() {
            @Override
            public void onClick(TextItem textItem) {

                new AlertDialog.Builder(SettingsActivity.this).setTitle(getString(R.string.export_database))
                        .setMessage(com.infonium.password.R.string.confrim_export_database)
                        .setCancelable(false)
                        .setPositiveButton(com.infonium.password.R.string.yes, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface d, int which) {
                                d.dismiss();
                                dialog = ResUtil.getInstance(null).showProgressbar(SettingsActivity.this);
                                DBExportRunnable runnable = new DBExportRunnable(SettingsActivity.this);
                                new Thread(runnable).run();
                            }
                        })
                        .setNegativeButton(com.infonium.password.R.string.cancel, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        }).show();

            }
        }));


        addItem(new HeaderItem(this).setTitle(getString(R.string.about)));
        addItem(new TextItem(this, "about").setTitle(getResources().getString(R.string.about_puff_title)).setOnclick(new TextItem.OnClickListener() {
            @Override
            public void onClick(TextItem textItem) {
                startActivity(new Intent(SettingsActivity.this, AboutActivity.class));
            }
        }));

    }

    @Override
    public StorageInterface initStorageInterface() {
        return UserDefault.getInstance(this);
    }


    @Override
    public void onResume() {
        super.onResume();
        quickSwitcher.updateTitle(UserDefault.getInstance(null).hasQuickPassword()
                ? getString(R.string.disable_gesture_lock)
                : getString(R.string.enable_gesture_lock));
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }


    public void onEventMainThread(Object event) {
//        if (!(event instanceof DBExportEvent)) {
//            return;
//        }
        if (event instanceof CryptoEvent && didClickedChangeMaster) {
            didClickedChangeMaster = false;
            if (((CryptoEvent) event).getType() == AppConstants.TYPE_MASTERPWD) {
                Intent intent = new Intent(SettingsActivity.this, SetMasterPasswordActivity.class);
                intent.putExtra("showMode", SetMasterPasswordActivity.ShowMode.ShowModeChange);
                intent.putExtra("oldPassword", ((CryptoEvent) event).getResult());
                UserDefault.getInstance(null).clearQuickPassword();
                AccountHelper.getInstance(null).clearQuickAccount();
                startActivity(intent);
            }
            return;
        }
        if (dialog != null) {
            dialog.dismiss();
        }
        if (!(event instanceof DBExportEvent)) {
            return;
        }
        DBExportEvent dbExportEvent = (DBExportEvent) event;
        if (dbExportEvent.success) {
            new AlertDialog.Builder(this)
                    .setTitle(R.string.success_em)
                    .setMessage(getString(R.string.database_exported_to)
                                    + dbExportEvent.filePath)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    })
                    .show();
        } else {
            new AlertDialog.Builder(this).setTitle(R.string.failed_em)
                    .setMessage(R.string.please_try_again)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    })
                    .show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode != RequestCodeSetMainPassword ) {
            return;
        }
        if (resultCode != RESULT_OK) {
            UserDefault.getInstance(null).clearQuickPassword();
        } else {
            UserDefault.getInstance(null).setHasQuickPassword();
        }
    }

}

当我将 AppcompatActivity 扩展为超类时,除了抽象类 MaterialSettings 的 addItem 之外,错误将被删除。

当我将 MaterialSettings 扩展为超类时,会产生上述错误。

我正在 Android 中设计一个设置页面。还尝试了外部工具中的 javah,并将 appcompact 的最新版本更改为 28.+ 和 27.1.1,但仍然没有解决错误。

请指导我在哪里以及需要更新或更改的内容。

继承 AppCompatActivity - 错误如下所示

继承 MaterialSettings - 错误如下所示

【问题讨论】:

    标签: android android-studio material-design settings android-appcompat


    【解决方案1】:

    Material Settings 是一个从ActionBarActivity 扩展而来的第三方库。但是,ActionBarActivity 已弃用,不应再使用。为了在您的活动中支持操作栏,您应该从AppCompatActivity 扩展。

    我建议不要为此目的使用第 3 方、未维护的库。相反,实现您自己的设置屏幕。如果你不知道怎么做,你可以在网上找到很多教程。这里有一个供您参考:https://medium.com/@JakobUlbrich/building-a-settings-screen-for-android-part-1-5959aa49337c

    【讨论】:

    • 谢谢先生的指导
    • 不客气!如果您对答案感到满意,请将其作为正确答案除外。
    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多