2016-03-03 2 views
0

Я разместил кнопку изображения поверх изображения, которое находится внутри CardView. Я хочу вызвать некоторые действия, когда пользователь нажимает кнопку «Изображение». Однако первая проблема заключается в том, что когда я получаю кнопку изображения с помощью findViewById внутри MainActivity, он возвращает null (может быть, потому, что образ изображения находится внутри item_row xml, который показывает данные строки в виде карты).Событие Onclick не запускается для кнопки «Изображение», расположенной на изображении в кармане

Другая проблема заключается в том, как решить такой сценарий, когда activity_main.xml отличается от другого, который содержит просмотр recycler, у которого есть item_row.xml с кнопкой изображения поверх изображения.

MainActivity.java

package com.innovation.myapp.jwelleryonrent.View; 

import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.innovation.myapp.jwelleryonrent.R; 
import com.innovation.myapp.jwelleryonrent.controller.jwelleryController; 
import com.innovation.myapp.jwelleryonrent.model.adapter.CustomItemClickListner; 
import com.innovation.myapp.jwelleryonrent.model.adapter.JwelleryAdapter; 
import com.innovation.myapp.jwelleryonrent.model.pojo.JwelleryCollection; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements jwelleryController.JwelleryCallbackListener { 
    private Toolbar mToolbar; 
    private RecyclerView mRecyclerView; 
    private SwipeRefreshLayout mSwipeRefreshLayout; 
    private List<JwelleryCollection> mJwelleryList = new ArrayList<>(); 
    private JwelleryAdapter mJwelleryAdapter; 
    private jwelleryController mController; 
    private boolean isInFavourites = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     configToolbar(); 
     mController = new jwelleryController(MainActivity.this); 
     configViews(); 
     ImageButton imgButton = (ImageButton) findViewById(R.id.favIcon); 
     imgButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Snackbar.make(v, "Item Added", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 


     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 




    } 


    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.item_row, container, false); 
     ImageButton imgBtn = (ImageButton) findViewById(R.id.favIcon); 
     imgBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       addItemToBag(v); 
      } 
     }); 
     return rootView; 
    } 


    private void addItemToBag(View v) 
    { 
     isInFavourites = true; 
     ImageButton btnFaviourite = (ImageButton) findViewById(R.id.favIcon); 
     if(isInFavourites==true) { 

      btnFaviourite.setImageResource(R.drawable.ic_favorite_white_24dp); 
     } 
     else 
      btnFaviourite.setImageResource(R.drawable.ic_favorite_border); 
     Snackbar.make(v, "Item added to Favourites", Snackbar.LENGTH_LONG) 
       .setAction("Action", null).show(); 
    } 


    private void configToolbar() { 
     mToolbar = (Toolbar) this.findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
    } 

    private void initializeAdapter() 
    { 

     mJwelleryAdapter = new JwelleryAdapter(mJwelleryList); 

     mJwelleryAdapter.setOnItemClickListner(new CustomItemClickListner() { 
      @Override 
      public void onItemClick(View v, int position) { 
       Toast.makeText(MainActivity.this, "Clicked Item: "+position,Toast.LENGTH_LONG).show(); 
      } 
     }); 

//  mJwelleryAdapter = new JwelleryAdapter(mJwelleryList, new CustomItemClickListner() { 
//   @Override 
//   public void onItemClick(View v, int position) { 
//    Toast.makeText(MainActivity.this, "Clicked Item: "+position,Toast.LENGTH_LONG).show(); 
//   } 
//  }); 
     mRecyclerView.setAdapter(mJwelleryAdapter); 

     mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.colorAccent), 
       getResources().getColor(R.color.colorPrimary), 
       getResources().getColor(R.color.colorPrimaryDark)); 

     mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       mController.startFetching(); 
      } 
     }); 


    } 


    private void configViews() { 
     mRecyclerView = (RecyclerView) this.findViewById(R.id.list); 
     mSwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe); 

     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 
     mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 
     mController.startFetching(); 
     initializeAdapter(); 
//  mJwelleryAdapter= new JwelleryAdapter(mJwelleryList); 

    } 

     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

     @Override 
     public void onFetchStart() { 

     } 

     @Override 
     public void onFetchProgress(JwelleryCollection jwellery) { 
      mJwelleryAdapter.addJwellery(jwellery); 
     } 

     @Override 
     public void onFetchProgress(List<JwelleryCollection> jwelleryList) { 

     } 

     @Override 
     public void onFetchComplete() { 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 

     @Override 
     public void onFetchFailure() { 

     } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     android:elevation="8dp"/> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_main" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_dialog_email" /> 

</android.support.design.widget.CoordinatorLayout> 

item_row.xml, который содержит кнопку Image (ID = Favicon) в верхней части изображения View. Я хочу, чтобы вызвать действие на Favicon

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_margin="8dp" 
card_view:cardCornerRadius="1dp" 
> 

<RelativeLayout 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="8dp" 
    android:layout_margin="5dp" 
    > 

    <ImageView 
     android:id="@+id/flowerImage" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 

     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:visibility="visible"/> 
    <ImageButton 
     android:id="@+id/favIcon" 
     android:layout_width="32dp" 
     android:layout_height="32dp" 
     android:scaleType="fitXY" 
     android:layout_margin="5dp" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@drawable/ic_favorite_border" 
     /> 



    <LinearLayout 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/flowerImage" 

     android:orientation="vertical" 
     > 

     <TextView 
      android:id="@+id/flowerName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Medium Text" 
      android:textColor="@color/colorPrimary" 
      android:textAppearance="?android:attr/textAppearanceMedium" 

/> 

     <TextView 
      android:id="@+id/flowerCategory" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Small Text" 
      android:layout_alignBottom="@id/flowerName" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:visibility="visible"/> 

     <TextView 
      android:id="@+id/flowerPrice" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/flowerCategory" 
      android:text="New Text" 
      android:visibility="visible"/> 

     <TextView 
      android:id="@+id/flowerInstruction" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:visibility="gone" 
      android:text="New Text" 
/> 

    </LinearLayout> 


</RelativeLayout> 

</android.support.v7.widget.CardView> 

код для класса ViewHolder,

public class Holder extends RecyclerView.ViewHolder { 

    public TextView mName, mCategory, mPrice, mInstructions; 
    public ImageView mImage; 


    public Holder(View itemView) { 
     super(itemView); 
     mImage = (ImageView) itemView.findViewById(R.id.flowerImage); 
     mName = (TextView) itemView.findViewById(R.id.flowerName); 
     mCategory = (TextView) itemView.findViewById(R.id.flowerCategory); 
     mPrice = (TextView) itemView.findViewById(R.id.flowerPrice); 
     mInstructions = (TextView) itemView.findViewById(R.id.flowerInstruction); 

     ImageButton imgButton = (ImageButton) itemView.findViewById(R.id.favIcon); 
     imgButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       addItemToBag(v); 
      } 
     }); 


    } 


    public Holder(View itemView,int ViewType,Context c) { 
    // Creating ViewHolder Constructor with View and viewType As a parameter 
     super(itemView); 

    } 
+0

Ваш вопрос очень неясно, почему вы используете кавычки ? Просто напишите обычный текст. Все, что вы разместили, это xml, но вы утверждаете, что ваш 'onClick' не работает, потому что' findViewById' имеет значение null. Отправьте свой фактический код. Причина, по которой ваш «ImageButton» имеет значение null, вероятнее всего, поскольку вы вызываете его в своей «Деятельности», но вы раздуваете представление в своем адаптере. – Pztar

+0

@Vimal вы можете поделиться Java-кодом, где вы устанавливаете onClickListener для imageButton? –

+0

Вот код для MainActivity.java для onCreate ImageButton imgButton = (ImageButton) findViewById (R.id.favIcon); // Здесь я получаю imgButton утратившего imgButton.setOnClickListener (новый View.OnClickListener() { @Override общественного недействительный OnClick (View v) { Snackbar.make (v, "Item Добавлены", Snackbar.LENGTH_LONG) .setAction («Действие», null) .show(); } }); – Vimal

ответ

0

попробовать его (rootView добавлено):

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    View rootView = inflater.inflate(R.layout.item_row, container, false); 
    ImageButton imgBtn = (ImageButton) rootView.findViewById(R.id.favIcon); 
    imgBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      addItemToBag(v); 
     } 
    }); 
    return rootView; 
} 
+0

Когда onCreateView тигрируется? потому что сейчас он не запускается, когда я нажимаю кнопку «Изображение». Другим способом, который я сделал, является использование всего кода onCreateView и размещение внутри конструктора ViewHolder, нажатие кнопки изображения запускается, но когда я просматриваю список, код функции addItemToBag выполняется, хотя я не нажал кнопку «Изображение» на любой другой карте. . – Vimal

+0

Вы предлагаете решение вышеприведенных комментариев? – Vimal

+0

Я не могу видеть ваш код владельца, PLZ отправить его. это право сделать это в вашем конструкторе держателя. – MahDi