2016-10-27 3 views
1

Спасибо, что узнал мой вопрос!не входит в класс/новое намерение не может решить конструктор

У меня есть relativly ismple цикл, который добавит onClickListener каждому ImageView я добавить в мой макет, однако при попытке добавить новый 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 .... ». Так что, когда я искал решение, люди предложили изменить «это» в «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(); 
    } 

} 
+0

Пожалуйста, разместите полное сообщение об ошибке. Усекая, вы, возможно, оставляете информацию, которая нам нужна, чтобы помочь вам. Кроме того, помните, что в Java весь исполняемый код принадлежит методу в классе. В частности, какой класс и метод содержит код, который устанавливает 'onClickListener()'? Предоставление нам этого контекста помогает нам лучше понять ваши фрагменты кода. –

+0

Привет, Code-Apprentice, спасибо за ваш ответ. Я добавил полный код в OP. Я также попытался извлечь его из OnCreate и выполнить настройку onClickListener в другом методе, но опять же без succes. – sdieters

+0

Вы должны отредактировать исходные фрагменты кода, чтобы они находились внутри метода внутри класса так же, как и в файле .java. Добавленный код имеет много строк, которые не имеют отношения к вашему вопросу. –

ответ

1

Вам необходимо использовать подкласс Activity, который содержит код, который создает OnClickListener. Во многих примерах это MainActivity. Однако это не похоже на ваш код. Так как вы в классе с именем DetailsActivity затем использовать это имя:

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

Из того, что я могу видеть ваш код здесь, я настоятельно рекомендую, чтобы вы узнали о ListView и RecyclerView. Они немного сложны, но как только вы их понимаете, они выполняют большую часть работы для вас, подобно тому, что вы пытаетесь сделать здесь. Во-первых, они более эффективны, чем ваш собственный код, потому что они создают только столько просмотров, сколько видно.

Давайте более внимательно посмотреть на ваш другой пример:

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.

+0

Я не использую никаких фрагментов или других особых вещей. Это было помещено в метод OnCreate. См. Полный код в OP. Благодаря! – sdieters

+0

@sdieters См. Мое редактирование. –

+0

Ах да, это сработало! Я добавил класс в OP, который работал так, как я его пробовал раньше, вызывая метод для установки onClickListener вместо того, чтобы делать это в методе OnCreate. Там мне не приходилось устанавливать класс до «этого». Можете ли вы объяснить мне, где разница? Еще раз спасибо! – sdieters

1

Вы этот блок

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

Change MainActivity.this к тому, что Activity подкласс является установка OnClickListener. Это будет DetailsActivity.this в вашем случае. В основном, входящая активность просто означает имя файла класса (который также является именем класса Activity), в котором определяется Activity, этот Activity инкапсулирует вызов на .setOnClickListener(), которому вы передаете анонимный внутренний класс, который является являющийся , прилагается внутри вашего DetailsActivity, отсюда и название прилагаемой деятельности. Надеюсь, что имеет смысл

+0

Уже пробовал это, но я не могу понять, что должно делать приложение Enclosing Activity в моем случае. Полный код теперь находится в OP. Благодаря! – sdieters

+0

@sdieters см. Мое редактирование – Dummy

Смежные вопросы