gpt4 book ai didi

java - 不是封闭类/新意图无法解析构造函数

转载 作者:行者123 更新时间:2023-11-30 02:45:32 25 4
gpt4 key购买 nike

感谢您查看我的问题!

我有一个相对简单的循环,它将向我添加到布局中的每个 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);
}

将导致“无法解析构造函数'意图......”错误。所以当我寻找解决方案时,人们建议将“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);
}

奇怪的是,我在创建应用程序的过程中做了很多新的意图,但我似乎无法解决这个问题。我在这里缺少什么?

完整代码来自此处

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();
}

}

最佳答案

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

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

从我在这里看到的代码来看,我强烈建议您了解 ListViewRecyclerView。它们有点复杂,但是一旦您理解了它们,它们就会为您完成大部分工作,类似于您在这里尝试做的事情。一方面,它们比您自己的代码更高效,因为它们只创建可见的 View 。

让我们更仔细地看看您的另一个示例:

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 的地方使用。 (有关这方面的更多详细信息,您需要阅读继承和多态性。)

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

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

关于java - 不是封闭类/新意图无法解析构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com