【问题标题】:PreferenceActivity: OnPreferenceStartFragment "Syntax error on token ";", { expected after this token"PreferenceActivity: OnPreferenceStartFragment "令牌语法错误 ";", { 预期在此令牌之后"
【发布时间】:2013-11-20 23:35:09
【问题描述】:

所以我正在尝试制作一个“设置”屏幕,它似乎可以工作,直到我意识到首选项不会对点击做出反应。我尝试使用 onPreferenceStartFragment,但遇到了一个奇怪的错误,我遇到了一行

boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) 

这是 onPreferenceStartFragment:

public interface OnPreferenceStartFragment {
        boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);
        //Syntax error on token ";", { expected after this token

        if(pref == password) {
            LayoutInflater inflater = LayoutInflater.from(context);
            final View text = inflater.inflate(R.layout.changepassword, null);
            final EditText currentPassword = (EditText)text.findViewById(R.id.currentPassword);
            final EditText newPassword = (EditText)text.findViewById(R.id.newPassword);

            final AlertDialog.Builder alert = new AlertDialog.Builder(context);
            alert.setTitle("Change Your Password");
            alert.setView(text);
            alert.setPositiveButton("Change", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                        String stringData = currentPassword.getText().toString().trim();
                        String stringNew = newPassword.getText().toString().trim();
                        dataReturned = myFolder.getString("passwordKey", "");
                        if(dataReturned.equals(stringData)) {                       
                            String newData = newPassword.getText().toString().trim();
                            SharedPreferences.Editor editor = myFolder.edit();
                            editor.putString("passwordKey", newData);
                            editor.commit();
                            dataReturned  = myFolder.getString("passwordKey", "couldn't load data");
                            Toast.makeText(context, "Password changed", Toast.LENGTH_SHORT).show();
                            currentPassword.setText("");
                            newPassword.setText("");
                        }

                        else {
                            Toast.makeText(context, "Incorrect Password", Toast.LENGTH_LONG).show();
                            currentPassword.setText("");
                            newPassword.setText("");
                        }
                    }
                });
            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    dialog.cancel();
                }
                });
            alert.show();
            ;
        }
        if(pref == notification) {
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.device_access_secure)
            .setOngoing(true)
            .setContentTitle("Obstruct")
            .setContentText("Start Stealth Mode");

            Intent resultIntent = new Intent();

            TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
            stackBuilder.addNextIntent(resultIntent);

            PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
            mBuilder.setContentIntent(resultPendingIntent);

            NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(0, mBuilder.build());
        }
        return true;
    }

一切似乎都是正确的,但事实并非如此,这让我感到困惑。有什么想法吗?

【问题讨论】:

    标签: android android-preferences preference


    【解决方案1】:

    我对 Java 接口不太熟悉,但我怀疑编译器希望您定义一个名为 onPreferenceStartFragment 的方法。当然,鉴于该行之后的下一条语句

    ,您的代码似乎也表明了这一点
    boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);
    

    是一个 if 语句。

    您可能希望通过定义 onPreferenceStartFragment 方法及其在界面中的主体来查看您的括号以及您想要实现的目标。事实上,经过快速搜索,我什至不确定您是否可以在接口中定义方法体。

    编辑:为了正确起见,我将添加接口中定义的默认方法体是 Java 8 的可用功能。但是 Android 不支持 Java 8,因此不支持接口中定义的方法体。见What is the "default" implementation of method defined in an Interface?

    【讨论】:

      【解决方案2】:
      boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);
      

      是一个方法,它下面的代码是调用此方法时执行的代码。行尾不应该有分号,应该是开始方法的左括号。

      应该是:

      boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref){
      
          if(pref == password) {
          ... <the rest of your code here>
          ...
          return true;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多