【问题标题】:is not an enclosing class / new Intent Cannot Resolve Constructor不是封闭类/新意图无法解析构造函数
【发布时间】:2017-03-10 18:51:01
【问题描述】:

感谢您查看我的问题!

我有一个相对简单的循环,它将向我添加到布局中的每个 ImageView 添加一个 onClickListener,但是当尝试向其中添加一个新 Intent 时,它给了我以下错误之一:

    String[] imageURLs = imageURLsString.split("/");
    for (int i = 0; i < imageURLs.length; i++){
        ImageView image = new ImageView(this);
        image.setLayoutParams(new android.view.ViewGroup.LayoutParams(getPx(182),getPx(256)));
        image.setPadding(getPx(3),getPx(3),getPx(3),getPx(3));
        final String imageURL = ".../images/" + imageURLs[i];
        Picasso.with(this).load(imageURL).into(image);

        image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent;
                intent = new Intent(this, ImageActivity.class);
                intent.putExtra("URL", imageURL);
                startActivity(intent);
            }
        });
        linearLayout.addView(image);
    }

将导致“无法解析构造函数'Intent ....”错误。 所以当我在寻找解决方案时,人们建议将“this”改为“MainActivity.this”,但是......

    String[] imageURLs = imageURLsString.split("/");
    for (int i = 0; i < imageURLs.length; i++){
        ImageView image = new ImageView(this);
        image.setLayoutParams(new android.view.ViewGroup.LayoutParams(getPx(182),getPx(256)));
        image.setPadding(getPx(3),getPx(3),getPx(3),getPx(3));
        final String imageURL = ".../images/" + imageURLs[i];
        Picasso.with(this).load(imageURL).into(image);

        image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent;
                intent = new Intent(MainActivity.this, ImageActivity.class);
                intent.putExtra("URL", imageURL);
                startActivity(intent);
            }
        });
        linearLayout.addView(image);
    }

导致:com.myName.appName.MainActivity 不是封闭类

这是 ImageActivity 类:

public class ImageActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);

        String URL = getIntent().getExtras().getString("URL");

        ImageView imageView = (ImageView) findViewById(R.id.image);
        imageView.getLayoutParams().height = (int) (imageView.getLayoutParams().width * (Float.valueOf(String.valueOf(1.41))));
        Picasso.with(this).load(URL).into(imageView);
    }

奇怪的是,我在玩游戏的时候做了很多新的 Intent 来创建应用程序,但我似乎无法解决这个问题。我在这里错过了什么?

这里的完整代码

public class DetailsActivity extends AppCompatActivity {


    TextView TVWeChatIdValue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

        String dataString = getIntent().getExtras().getString("dataString");
        String[] itemData = dataString.split(",");
        String category = itemData[0];
        Log.e("DetailsActivity", category);
        String itemID = itemData[1];
        Log.e("DetailsActivity", itemID);
        String imageURLsString = itemData[2];
        Log.e("DetailsActivity", imageURLsString);
        String description = itemData[3];
        Log.e("DetailsActivity", description);
        String price = itemData[4];
        Log.e("DetailsActivity", price);

        String itemCode = category + itemID;

        TextView textView;
        textView = (TextView) findViewById(R.id.Title);
        textView.setText(getResources().getString(R.string.app_name));
        textView = (TextView) findViewById(R.id.ItemReferralValue);
        textView.setText(itemCode);
        textView = (TextView) findViewById(R.id.ItemPriceValue);
        textView.setText(price);

        TVWeChatIdValue = (TextView) findViewById(R.id.WeChatIDValue);
        new DatabaseTask(this, "details", "GETWECHATID").execute();

        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ItemDetailsContent);

        String[] imageURLs = imageURLsString.split("/");
        for (int i = 0; i < imageURLs.length; i++){
            ImageView image = new ImageView(this);
            image.setLayoutParams(new android.view.ViewGroup.LayoutParams(getPx(182),getPx(256)));
            image.setPadding(getPx(3),getPx(3),getPx(3),getPx(3));
            final String imageURL = ".../images/" + imageURLs[i];
            Picasso.with(this).load(imageURL).into(image);

            image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent;
                    intent = new Intent(this, ImageActivity.class);
                    intent.putExtra("URL", imageURL);
                    startActivity(intent);
                }
            });
            linearLayout.addView(image);
        }

        ImageView imageView = (ImageView) findViewById(R.id.ItemDetailsDescription);
        String imageURL = ".../images/" + description;
        Picasso.with(this).load(imageURL).into(imageView);

    }

    public void SetWeChatId(String mValue) {
        TVWeChatIdValue.setText(mValue);
    }

    public int getPx(int dimensionDp) {
        float density = getResources().getDisplayMetrics().density;
        return (int) (dimensionDp * density + 0.5f);
    }
}

工作代码

public class MainActivity extends AppCompatActivity {

    TextView TVWeChatIdValue;
    LinearLayout linearLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView;
        textView = (TextView) findViewById(R.id.Title);
        textView.setText(getResources().getString(R.string.app_name));
        textView = (TextView) findViewById(R.id.SubTitle);
        textView.setText(getResources().getString(R.string.slogan));

        textView = (TextView) findViewById(R.id.MoreForWomen);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                OpenCatalog("women");
            }
        });
        textView = (TextView) findViewById(R.id.MoreForMen);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                OpenCatalog("men");
            }
        });
        textView = (TextView) findViewById(R.id.MoreForKids);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                OpenCatalog("kids");
            }
        });
    }

    public void GetData() {
            TVWeChatIdValue = (TextView) findViewById(R.id.WeChatIDValue);
            new DatabaseTask(this, "main", "GETWECHATID").execute();

            linearLayout = (LinearLayout) findViewById(R.id.NewItemsForWomenContent);
            linearLayout.removeAllViewsInLayout();
            new DatabaseTask(this, linearLayout, "WOMEN", "GETNEWESTITEMS").execute();
            linearLayout = (LinearLayout) findViewById(R.id.NewItemsForMenContent);
            linearLayout.removeAllViewsInLayout();
            new DatabaseTask(this, linearLayout, "MEN", "GETNEWESTITEMS").execute();
            linearLayout = (LinearLayout) findViewById(R.id.NewItemsForKidsContent);
            linearLayout.removeAllViewsInLayout();
            new DatabaseTask(this, linearLayout, "KIDS", "GETNEWESTITEMS").execute();
    }

    public void SetWeChatId(String mValue) {
        TVWeChatIdValue.setText(mValue);
    }

    public void ProcessNewItems(LinearLayout mLinearLayout, final String mCategory, final HashMap<Integer, Item> mItems){
        for (int i = 0; i < mItems.size(); i++) {
            ImageView image = new ImageView(this);
            image.setLayoutParams(new android.view.ViewGroup.LayoutParams(getPx(96),getPx(128)));
            image.setPadding(getPx(3),getPx(3),getPx(3),getPx(3));
            String imageURL = ".../images/" + mItems.get(i).getImageURLs()[0];
            Picasso.with(this).load(imageURL).into(image);

            mLinearLayout.addView(image);
            final int index = i;
            image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ShowItemDetails(mCategory, mItems.get(index));
                }
            });
        }
    }

    void ShowItemDetails(String mCategory, Item mItem){
        Intent intent = new Intent(this, DetailsActivity.class);
        intent.putExtra("dataString", mItem.GetDataString());
        Log.e("CatalogActivity", mItem.GetDataString());
        startActivity(intent);
    }

    void OpenCatalog(String mCategory){
        //show catalog
        Intent intent = new Intent(this, CatalogActivity.class);
        intent.putExtra("category", mCategory);
        startActivity(intent);
    }

    public int getPx(int dimensionDp) {
        float density = getResources().getDisplayMetrics().density;
        return (int) (dimensionDp * density + 0.5f);
    }

    @Override
    public void onResume() {
        super.onResume();

        GetData();
    }

}

【问题讨论】:

  • 请张贴整个错误信息。通过截断,您可能会遗漏我们需要帮助您的信息。另外,请记住,在 Java 中,所有可执行代码都属于类中的方法。特别是,哪个类和方法包含设置onClickListener() 的代码?向我们提供此上下文有助于我们更好地理解您的代码 sn-ps。
  • 嗨@Code-Apprentice,感谢您的回复。我已经在 OP 中添加了完整的代码。我也尝试将其从 OnCreate 中取出并以另一种方法设置 onClickListener,但再次失败。
  • 您应该编辑原始代码 sn-ps 以便它们在类中的方法中,就像在 .java 文件中一样。您添加的代码有很多行与您的问题无关。
  • 另外,如果您需要额外的帮助,您可以提供比“没有成功”更多的细节。
  • 确实,我应该说它给出的结果与之前的尝试相同。对不起!我也会记下您对未来帖子的建议。

标签: java android-studio android-intent onclicklistener


【解决方案1】:

您需要使用Activity 子类的名称,其中包含创建OnClickListener 的代码。在许多示例中,这是MainActivity。但是,您的代码中似乎并非如此。由于您在一个名为 DetailsActivity 的班级中,请使用该名称:

Intent intent = new Intent(DetailsActivity.this, ImageActivity.class);

从我在这里看到的你的代码来看,我强烈建议你了解ListViewRecyclerView。它们有点复杂,但是一旦你理解了它们,它们就会为你做很多工作,就像你在这里尝试做的一样。一方面,它们比您自己的代码更高效,因为它们只创建可见的视图。

让我们更仔细地看看你的另一个例子:

public class MainActivity extends AppCompatActivity { 
    // ...
    void ShowItemDetails(String mCategory, Item mItem){
        Intent intent = new Intent(this, DetailsActivity.class);
        intent.putExtra("dataString", mItem.GetDataString());
        startActivity(intent);
     }
}

注意ShowItemDetails()MainActivity 类中。所以this 指的是该类的一个实例,可以在需要Context 的任何地方使用。 (有关这方面的更多详细信息,您需要阅读有关继承和多态性的信息。)

另一方面,您的原始代码在一个方法中创建了一个Intent,该方法位于OnClickListener 的匿名子类中,该子类不能用作Context。然而,匿名内部类位于DetailsActivity 内部的一个方法中,该方法继承自Context。为了访问这个外部类的实例,你必须使用DetailsActivity.this

有关更多详细信息,您应该了解特殊的 this 引用和内部类。

【讨论】:

  • 我没有使用任何片段或其他特殊的东西。这被放置在 OnCreate 方法中。请参阅 OP 中的完整代码。谢谢!
  • 啊,是的,完成了任务!我已经通过调用方法来设置 onClickListener 而不是在 OnCreate 方法中执行,向 OP 添加了一个类,该类的工作方式与我之前尝试过的方式相同。在那里,我不必在“this”之前设置课程。你能解释一下区别在哪里吗?再次非常感谢!
  • 另外,我确实知道如何使用 ListViews、ScrollViews、Grids 和创建自定义适配器,但我正在尝试一些新东西。我喜欢通过试错来学习新事物嘿嘿 =)
  • @sdieters 查看我最近的编辑以获得更详细的解释。实验是一种很好的学习方式。祝你好运!
  • 我明白了,这完全有道理。非常感谢!
【解决方案2】:

你有这个块

image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent;
        intent = new Intent(MainActivity.this, ImageActivity.class);
        intent.putExtra("URL", imageURL);
        startActivity(intent);
    }
});

MainActivity.this 更改为设置OnClickListener 的任何Activity 子类。在您的情况下,那将是DetailsActivity.this。基本上,封闭的活动只是意味着定义Activity 的类文件的名称(这也是Activity 类的名称),这个Activity 封装了对您所在的.setOnClickListener() 的调用传递一个匿名内部类,该内部类封闭在您的DetailsActivity 中,因此名称为封闭活动。希望这是有道理的

【讨论】:

  • 已经尝试过了,但我似乎无法弄清楚在我的情况下封闭活动应该是什么。完整的代码现在在 OP 中。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2015-05-05
  • 2017-02-28
相关资源
最近更新 更多