java - 构造函数未定义

标签 java android constructor preference

所以我正在尝试将变更日志合并到我的应用程序中。如果我将此代码放入 Activity 的 onCreate 方法中,一切都会正常工作,但我不希望这样,我希望它在用户单击我的首选项类中的“changelog”首选项时正常工作。

这是我正在使用的代码

    //Launch change log dialog
     ChangeLogDialog _ChangelogDialog = new ChangeLogDialog(this); 
     _ChangelogDialog.show();

但是当我将其放在我的点击偏好中时,我收到此错误

“构造函数 ChangeLogDialog(new Preference.OnPreferenceClickListener(){}) 未定义”

这是变更日志类

import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;

/*
 * Class to show a changelog dialog
 * (c) 2012 Martin van Zuilekom (http://martin.cubeactive.com)
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

public class ChangeLogDialog {
    static final private String TAG = "ChangeLogDialog"; 

    static final private String TITLE_CHANGELOG = "title_changelog"; 
    static final private String CHANGELOG_XML = "changelog"; 

    private Activity fActivity;

    public ChangeLogDialog(Activity context) {
        fActivity = context;
    }

    //Get the current app version
    private String GetAppVersion(){
        try {
            PackageInfo _info = fActivity.getPackageManager().getPackageInfo(fActivity.getPackageName(), 0);
            return _info.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
            return "";
        }
    }

    //Parse a the release tag and return html code
    private String ParseReleaseTag(XmlResourceParser aXml) throws XmlPullParserException, IOException {
        String _Result = "<h1>Release: " + aXml.getAttributeValue(null, "version") + "</h1><ul>";
        int eventType = aXml.getEventType();
        while ((eventType != XmlPullParser.END_TAG) || (aXml.getName().equals("change"))) {
            if ((eventType == XmlPullParser.START_TAG) &&(aXml.getName().equals("change"))){
                eventType = aXml.next();
                _Result = _Result + "<li>" + aXml.getText() + "</li>";
            }
            eventType = aXml.next();
        }       
        _Result = _Result + "</ul>";
        return _Result;
    }

    //CSS style for the html
    private String GetStyle() {
        return 
                "<style type=\"text/css\">"
                + "h1 { margin-left: 0px; font-size: 12pt; }" 
                + "li { margin-left: 0px; font-size: 9pt;}" 
                + "ul { padding-left: 30px;}" 
                + "</style>";
    }

    //Get the changelog in html code, this will be shown in the dialog's webview
    private String GetHTMLChangelog(int aResourceId, Resources aResource) {
        String _Result = "<html><head>" + GetStyle() + "</head><body>";
        XmlResourceParser _xml = aResource.getXml(aResourceId);
        try
        {
            int eventType = _xml.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if ((eventType == XmlPullParser.START_TAG) &&(_xml.getName().equals("release"))){
                    _Result = _Result + ParseReleaseTag(_xml);

                }
                eventType = _xml.next();
            }
        } 
        catch (XmlPullParserException e)
        {
            Log.e(TAG, e.getMessage(), e);
        }
        catch (IOException e)
        {
            Log.e(TAG, e.getMessage(), e);

        }           
        finally
        {           
            _xml.close();
        }       
        _Result = _Result + "</body></html>";
        return _Result;
    }

    //Call to show the changelog dialog
    public void show() {
        //Get resources
        String _PackageName = fActivity.getPackageName();
        Resources _Resource;
        try {
            _Resource = fActivity.getPackageManager().getResourcesForApplication(_PackageName);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
            return;
        } 

        //Get dialog title              
        int _resID = _Resource.getIdentifier(TITLE_CHANGELOG , "string", _PackageName);
        String _Title = _Resource.getString(_resID);
        _Title = _Title + " v" + GetAppVersion();

        //Get Changelog xml resource id
        _resID = _Resource.getIdentifier(CHANGELOG_XML, "xml", _PackageName);
        //Create html change log
        String _HTML = GetHTMLChangelog(_resID, _Resource);

        //Get button strings
        String _Close =  _Resource.getString(R.string.changelog_close);

        //Check for empty changelog
        if (_HTML.equals("") == true)
        {
            //Could not load change log, message user and exit void
            Toast.makeText(fActivity, "Could not load change log", Toast.LENGTH_SHORT).show();
            return;
        }

        //Create webview and load html
        WebView _WebView = new WebView(fActivity);
        _WebView.loadData(_HTML, "text/html", "utf-8");
        AlertDialog.Builder builder = new AlertDialog.Builder(fActivity)
                .setTitle(_Title)
                .setView(_WebView)
                .setPositiveButton(_Close, new Dialog.OnClickListener() {
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });
        builder.create().show();
    }

}

最佳答案

应该是:

ChangeLogDialog _ChangelogDialog = new ChangeLogDialog(YourActivity.this);

在您的情况下,this 指的是您的匿名内部类 OnPreferenceClickListener 的实例,而不是您的 Activity。

关于java - 构造函数未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20227442/

相关文章:

c++ - 当存在两个用户定义的复制构造函数时,有没有办法执行复制构造函数?

java - Apache CXF FaultListener 未在 cxf 总线中注册

Android 计算机视觉 JavaCV OpenCV FastCV 比较

JAVA使用构造函数创建每个类的两个具有完整数据的对象,但出现错误

android - 在 Android 上使用 JetS3t 时抛出 IncompatibleClassChangeError 异常

android - 默认的 Android Studio 抽屉导航图标

c# - 构造函数不能调用自己c#

c# - 为什么 c# 程序员不像 java 程序员那样被 ruby​​ 吸引

java - URL 连接超时后导致应用程序崩溃

java - 不能对非静态方法进行静态引用