有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查询SearchView崩溃(尝试实现SearchView操作栏)

一切正常,只是当我尝试在我的应用程序上搜索时,它崩溃了。问题出在方法onQueryTextChange中,请帮助我解决它:

main活动

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, SearchView.OnQueryTextListener {
    private PackageManager packageManager = null;
    private List<ApplicationInfo> applist = null;
    private ApplicationAdapter listadaptor = null;
    private static final int REQUEST_CAMERA_PERMISSION = 200;
    Button goSettings;
    ListView listApps;
    Context context;
    Button go_AndroBooster,goPerms,lockAll,unlockAll,goLogs;
    Intent i;
    private AccountHeader headerResult = null;
    private Drawer result = null;
    private MiniDrawer miniResult = null;
    private CrossfadeDrawerLayout crossfadeDrawerLayout = null;
    MaterialProgressBar loadingBar;
    ColorManager colorManager;
    RelativeLayout mainLayout;
    ArrayList<ApplicationInfo> items;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        colorManager = new ColorManager(this);
        setSupportActionBar(toolbar);
        mainLayout = (RelativeLayout) findViewById(R.id.mainLayout);
        packageManager = getPackageManager();

        listApps = (ListView) findViewById(R.id.listApps);
        go_AndroBooster = (Button) findViewById(R.id.go_booster);
        goPerms = (Button) findViewById(R.id.goPerms);
        lockAll = (Button) findViewById(R.id.lock_all);
        unlockAll = (Button) findViewById(R.id.unlock_all);
        loadingBar = (MaterialProgressBar) findViewById(R.id.loadingBar);
        goLogs = (Button) findViewById(R.id.goLogs);
        goSettings = (Button) findViewById(R.id.lockSettings);
        listApps.setItemsCanFocus(true);



        startLockService();

        setSupportActionBar(toolbar);
        //set the back arrow in the toolbar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setTitle(R.string.app_name);
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#25517d")));


        final IProfile profile2 = new ProfileDrawerItem().withIcon(R.drawable.user_icon);
        // Create the AccountHeader
        headerResult = new AccountHeaderBuilder()
                .withActivity(this)

                .withTranslucentStatusBar(false)
                .withHeaderBackground(R.drawable.header)
                .addProfiles(profile2)
                .build();

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();





        result = new DrawerBuilder()
                .withActivity(this)
                .withToolbar(toolbar)
                .withDrawerLayout(R.layout.crossfade_material_drawer)
                .withHasStableIds(true)
                .withDrawerWidthDp(72)
                .withGenerateMiniDrawer(true)
                .withAccountHeader(headerResult) //set the AccountHeader we created earlier for the header
                .addDrawerItems(
                        new PrimaryDrawerItem().withName(R.string.Home).withIcon(R.drawable.homee).withIdentifier(1),
                        new PrimaryDrawerItem().withName(R.string.logs).withIcon(R.drawable.cleanapp).withIdentifier(2),
                        new PrimaryDrawerItem().withName(R.string.resetpass).withIcon(R.drawable.boost).withIdentifier(3),
                        new PrimaryDrawerItem().withName(R.string.language).withIcon(R.drawable.share).withIdentifier(4),

                        new PrimaryDrawerItem().withName(R.string.share).withIcon(R.drawable.rate).withIdentifier(6),
                        new PrimaryDrawerItem().withName(R.string.rate).withIcon(R.drawable.rate).withIdentifier(7)

                        // new DividerDrawerItem(),
                        //  new SecondaryDrawerItem().withName(R.string.drawer_item_seventh).withIcon(FontAwesome.Icon.faw_github).withIdentifier(7).withSelectable(false)
                ) // add the items we want to use with our Drawer
                .withSelectedItemByPosition(1)
                .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                    @Override
                    public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
                        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();


                        if (drawerItem.getIdentifier() == 1) {
                            // Toast.makeText(MainActivity.this,"2",Toast.LENGTH_LONG).show();

                            result.closeDrawer();


                        } else if (drawerItem.getIdentifier() == 2) {

                            i = new Intent(getApplicationContext(), LogsActivity.class);
                            startActivity(i);
                            result.closeDrawer();


                        } else if (drawerItem.getIdentifier() == 3) {

                            i = new Intent(getApplicationContext(), SetLockTypeActivity.class);
                            startActivity(i);
                            result.closeDrawer();


                        } else if (drawerItem.getIdentifier() == 4) {



                            LanguagesDialog languagesDialog = new LanguagesDialog();
                            languagesDialog.show(getFragmentManager(), "LanguagesDialogFragment");


                        } else if (drawerItem.getIdentifier() == 6) {

                            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                            sharingIntent.setType("text/plain");
                            sharingIntent.putExtra(安卓.content.Intent.EXTRA_TEXT, "http://play.google.com/store/apps/details?id="
                                    + getPackageName());
                            sharingIntent.putExtra(安卓.content.Intent.EXTRA_SUBJECT, "Subject");
                            startActivity(Intent.createChooser(sharingIntent, getResources().getText(R.string.shareusing)));
                            result.closeDrawer();


                        }else if (drawerItem.getIdentifier() == 7) {
                            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id="
                                    + getPackageName()));
                            startActivity(browserIntent);
                            result.closeDrawer();
                        }
//
//

                        return false;
                    }
                })
                .withSavedInstance(savedInstanceState)
                .withShowDrawerOnFirstLaunch(false)
                .build();



        //get out our drawerLyout
        crossfadeDrawerLayout = (CrossfadeDrawerLayout) result.getDrawerLayout();

        //define maxDrawerWidth
        crossfadeDrawerLayout.setMaxWidthPx(DrawerUIUtils.getOptimalDrawerWidth(this));
        //add second view (which is the miniDrawer)
        MiniDrawer miniResult = result.getMiniDrawer();
        //build the view for the MiniDrawer
        View view = miniResult.build(this);
        //set the background of the MiniDrawer as this would be transparent
        view.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(this, com.mikepenz.materialdrawer.R.attr.material_drawer_background, com.mikepenz.materialdrawer.R.color.material_drawer_background));
        //we do not have the MiniDrawer view during CrossfadeDrawerLayout creation so we will add it here
        crossfadeDrawerLayout.getSmallView().addView(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        //define the crossfader to be used with the miniDrawer. This is required to be able to automatically toggle open / close
        miniResult.withCrossFader(new ICrossfader() {
            @Override
            public void crossfade() {
                boolean isFaded = isCrossfaded();
                crossfadeDrawerLayout.crossfade(400);

                //only close the drawer if we were already faded and want to close it now
                if (isFaded) {
                    result.getDrawerLayout().closeDrawer(GravityCompat.START);
                }
            }

            @Override
            public boolean isCrossfaded() {
                return crossfadeDrawerLayout.isCrossfaded();
            }
        });
//hook to the crossfade event
        crossfadeDrawerLayout.withCrossfadeListener(new CrossfadeDrawerLayout.CrossfadeListener() {
            @Override
            public void onCrossfade(View containerView, float currentSlidePercentage, int slideOffset) {
                Log.e("CrossfadeDrawerLayout", "crossfade: " + currentSlidePercentage + " - " + slideOffset);
            }
        });


        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startReqUsageStat();
            }
        }, 3000);


        lockAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ManageLockedApps.lockAllApps(context);
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        finish();
                    }
                }, 2000);
            }
        });
        unlockAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ManageLockedApps.resetLockedApps(context);
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        finish();
                    }
                }, 2000);
            }
        });
        goPerms.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this, RequestPermission.class);
                startActivity(i);
            }
        });
        goLogs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this, LogsActivity.class);
                startActivity(i);
            }
        });
        go_AndroBooster.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startApplication("");
            }
        });
        goSettings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(i);
                finish();
            }
        });
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        listadaptor = new ApplicationAdapter(MainActivity.this,
                R.layout.app_list_item, applist);

        final Handler handler1 = new Handler();
        handler1.postDelayed(new Runnable() {
            @Override
            public void run() {
                new LoadApplications().execute();
            }
        }, 1500);
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION);
                }
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION);
                }
            }
        }).start();


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        return super.onOptionsItemSelected(item);
    }
    private void startLockService() {
        if (!isMyServiceRunning(LockService.class)){
            context.startService(new Intent(context, LockService.class));
        }
    }
    private void stopLockService() {
        context.stopService(new Intent(context, LockService.class));
    }
    private void startReqUsageStat(){
        if (安卓.os.Build.VERSION.SDK_INT >= 安卓.os.Build.VERSION_CODES.LOLLIPOP) {
            if (!checkUsageStatsPermission()){
                Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                startActivity(intent);
                Toast.makeText(context,getString(R.string.please_give_usage_Stats),Toast.LENGTH_LONG).show();
            }
        }
    } public boolean checkUsageStatsPermission(){
        final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        final List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0,  System.currentTimeMillis());
        return !queryUsageStats.isEmpty();
    }
    public void startApplication(String packageName)
    {
        try
        {
            Intent intent = new Intent("安卓.intent.action.MAIN");
            intent.addCategory("安卓.intent.category.LAUNCHER");

            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);

            for(ResolveInfo info : resolveInfoList)
                if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
                {
                    launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                    return;
                }
            showInMarket(packageName);
        }
        catch (Exception e)
        {
            showInMarket(packageName);
        }
    }
    public String getPattern() {
        File file = new File("/data/data/com.project.applocker/files/pattern");
        StringBuilder text = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;

            while ((line = br.readLine()) != null) {
                text.append(line);
            }
            br.close();
        } catch (IOException e) {
            Log.d("okuma hatası", "no 1");
        }
        return text.toString();
    }
    private void launchComponent(String packageName, String name)
    {
        Intent intent = new Intent("安卓.intent.action.MAIN");
        intent.addCategory("安卓.intent.category.LAUNCHER");
        intent.setComponent(new ComponentName(packageName, name));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        startActivity(intent);
    }
    private void showInMarket(String packageName)
    {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        final List<ApplicationInfo> appsList = context.getPackageManager().getInstalledApplications(0);
        final ApplicationInfo data = appsList.get(i);
        final SwitchCompat lockApp = (SwitchCompat) view.findViewById(R.id.lockApp);
        lockApp.performClick();
    }
    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {


        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        ArrayList<ApplicationInfo> templist = new ArrayList<>();

        for (ApplicationInfo temp : items){
            if (temp.toString().contains(newText.toLowerCase())){
                templist.add(temp);
            }


            ArrayAdapter<ApplicationInfo> adapter = new ArrayAdapter<>(MainActivity.this, 安卓.R.layout.simple_list_item_1,applist);
            listApps.setAdapter(adapter);

            return true;
        }

        return true;

};


private class LoadApplications extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
            listadaptor = new ApplicationAdapter(MainActivity.this,
                    R.layout.app_list_item, applist);
            if(!isMyServiceRunning(LockService.class)){
                startLockService();
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPostExecute(Void result) {
            listApps.setAdapter(listadaptor);
            listApps.setOnItemClickListener(MainActivity.this);
            loadingBar.setVisibility(View.INVISIBLE);
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            loadingBar.setVisibility(View.VISIBLE);
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
    String[] alphabet = "abcdefghijklmnopqrstuvwxyz".split("");

    @Override
    public void onPause() {
        super.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        startLockService();
    }
    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
        ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>();
        for (ApplicationInfo info : list) {
            try {

                if (!info.packageName.equals("com.google.安卓.googlequicksearchbox")) {
                    if (!info.packageName.equals("com.project.applocker")) {
                        if (!info.packageName.contains("launcher3")) {
                            if (!info.packageName.contains("launcher")) {//com.google.安卓.googlequicksearchbox
                                if (!info.packageName.contains("trebuchet")) {
                                    if (null != packageManager.getLaunchIntentForPackage(info.packageName)) {
                                        applist.add(info);
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return applist;
    }
}

适配器

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo>{
    private List<ApplicationInfo> appsList = null;
    private Context context;
    private PackageManager packageManager;
    List<String> allAppList = null;
    List<String> lockedAppList = null;
    ColorManager colorManager;
    SharedPreferences preferences;
    SharedPreferences.Editor editor;

    public ApplicationAdapter(Context context, int textViewResourceId,
                              List<ApplicationInfo> appList) {
        super(context, textViewResourceId, appList);
        this.context = context;
        allAppList = new ArrayList<String>();
        colorManager = new ColorManager(context);
        lockedAppList = new ArrayList<String>();
        this.appsList = appList;
        packageManager = context.getPackageManager();
        preferences=context.getSharedPreferences("chosen_apps", context.MODE_PRIVATE);
        Collections.sort(appsList, new ApplicationInfo.DisplayNameComparator(packageManager));
        editor = preferences.edit();
    }

    @Override
    public int getCount() {
        return ((null != appsList) ? appsList.size() : 0);
    }

    @Override
    public ApplicationInfo getItem(int position) {

        return ((null != appsList) ? appsList.get(position) : null);
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, final View convertView, ViewGroup parent) {
        View view = convertView;
        if (null == view) {
            LayoutInflater layoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.app_list_item, null);
        }
        final ApplicationInfo data = appsList.get(position);
        if (null != data) {

            ImageView iconview = (ImageView) view.findViewById(R.id.app_icon);
            CardView cardViewApps = (CardView) view.findViewById(R.id.cardViewApps);
            final SwitchCompat lockApp = (SwitchCompat) view.findViewById(R.id.lockApp);

            lockApp.setText(data.loadLabel(packageManager));
            iconview.setImageDrawable(data.loadIcon(packageManager));



            if(preferences.getBoolean(data.packageName,false)){
                lockApp.setChecked(true);
            }
            else{
                lockApp.setChecked(false);
            }


            lockApp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    context.stopService(new Intent(context, LockService.class));
                    if (lockApp.isChecked()){
                        Log.d("tıklanmış",""+data.packageName);
                        editor.putBoolean(data.packageName,true).apply();
                    }
                    if (!lockApp.isChecked()){
                        Log.d("silinmiş",""+data.packageName);
                        editor.putBoolean(data.packageName,false).apply();
                    }
                    context.startService(new Intent(context, LockService.class));
                }
            });
        }
        return view;
    }

    private void startLockService() {
        context.startService(new Intent(context, LockService.class));
    }
    private void stopLockService() {
        context.stopService(new Intent(context, LockService.class));
    }
}

问题在于:

@Override
public boolean onQueryTextChange(String newText) {
    ArrayList<ApplicationInfo> templist = new ArrayList<>();

    for (ApplicationInfo temp : items){
        if (temp.toString().contains(newText.toLowerCase())){
            templist.add(temp);
        }


        ArrayAdapter<ApplicationInfo> adapter = new ArrayAdapter<>(MainActivity.this, 安卓.R.layout.simple_list_item_1,applist);
        listApps.setAdapter(adapter);

        return true;
    }

    return true;
};

共 (1) 个答案

  1. # 1 楼答案

    我认为你的方法应该如下

    @Override
        public boolean onQueryTextChange(String newText) {
            ArrayList<ApplicationInfo> templist = new ArrayList<>();
    
            for (ApplicationInfo temp : items){
                if (temp.toString().contains(newText.toLowerCase())){
                    templist.add(temp);
                }
            }
            if(templist != null && templist.size() > 0){}
                ArrayAdapter<ApplicationInfo> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1,templist);
                listApps.setAdapter(adapter);
            }else{
                listApps.setAdapter(null);
            }
    
            return true;
    
    };