2017-03-06 9 views
0

アプリで検索しようとするとクラッシュすることを除いてすべて機能します。問題は方法onQueryTextChangeであり、私はそれを修正するために助けてください:QueryViewViewクラッシュ(SearchViewアクションバーを実装しようとしています)

MainActivity

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(android.content.Intent.EXTRA_TEXT, "http://play.google.com/store/apps/details?id=" 
            + getPackageName()); 
          sharingIntent.putExtra(android.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 (android.os.Build.VERSION.SDK_INT >= android.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("android.intent.action.MAIN"); 
      intent.addCategory("android.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("android.intent.action.MAIN"); 
     intent.addCategory("android.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, android.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.android.googlequicksearchbox")) { 
        if (!info.packageName.equals("com.project.applocker")) { 
         if (!info.packageName.contains("launcher3")) { 
          if (!info.packageName.contains("launcher")) {//com.google.android.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, android.R.layout.simple_list_item_1,applist); 
     listApps.setAdapter(adapter); 

     return true; 
    } 

    return true; 
}; 
+1

アプリケーションログを共有してください。 – Nakul

+0

なぜonQueryTextChangeメソッドでforループのアダプタを設定していますか? –

答えて

0

あなたの方法は以下のようにするべきだと思います

@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; 

}; 
+0

ご協力いただきありがとうございますが、動作していません – jamal

関連する問題