![](/img/trans.png)
[英]How to set a textView to visible after an onClick event and Activity change?
[英]How to get OnClick event of TextView in separate view?
我有一个小应用程序,它使用AsyncTask调用Web服务,并根据返回的结果填充自定义数组适配器。
由于这是与活动使用的视图不同的视图,因此当我尝试设置onClickListener时,始终出现以下错误:
Unable to start activity ComponentInfo{com.lorentzos.swipecards.example/com.lorentzos.swipecards.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
这对我来说很有意义,但我不确定如何解决。 这是我的代码。
我的活动使用以下没有我的TextView的布局:
setContentView(R.layout.activity_main);
当Web服务返回这些项目时,我用结果填充一个arraydapter,而该arraydapter使用不同的布局来显示结果。
arrayAdapter = new CustomAdapter(getApplicationContext(), R.layout.tradingcard, result);
我的onClickListener看起来像这样,它在我的活动onCreate()方法中:
TextView cardDesc = (TextView) this.findViewById(R.id.tv_cardDesc);
cardDesc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//open up a fragment to display the entire carddescription
//makeToast(getApplicationContext(), "Test description click");
}
});
先谢谢您的帮助! 我真的迷住了如何从我的活动中访问此TextView的click事件。
另一个问题:我试图访问click事件,以便打开一个弹出窗口或片段以显示更多信息,例如单击。 这是一个说明字段,因此它可以包含很多文本,但应用程序上只会显示几行,然后当用户单击说明时,应在另一个片段上打开该字段以显示整个文本并可以滚动。 最好的方法是什么? 创建一个打开的新片段?
activity_main.xml中:
<merge
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">
<com.lorentzos.flingswipe.SwipeFlingAdapterView
android:id="@+id/frame"
android:background="#d1d1d1"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rotation_degrees="15.5"
tools:context=".MainActivity"
android:layout_gravity="top"/>
<TextView
android:id="@+id/tv_noCardsLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textStyle="bold"
android:textSize="18sp"
android:textColor="#474747"
android:textAlignment="center"
tools:text="No Cards Left to Swipe!"
android:layout_gravity="center" />
<include layout="@layout/buttons" />
</merge>
tradingcard.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_gravity="top"
android:layout_width="match_parent"
android:layout_height="415dp"
android:padding="5dp"
android:layout_marginTop="20dp">
<LinearLayout
android:id="@+id/outerMainCardLayout"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_gravity="center_horizontal|top"
android:orientation="vertical"
android:background="@drawable/swipecard_shadow"
android:gravity="top"
android:layout_marginLeft="5dp">
<LinearLayout
android:id="@+id/mainCardLayout"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_gravity="center_horizontal|top"
android:orientation="vertical"
android:weightSum="1"
android:background="#FFFFFF"
android:gravity="top">
<TextView
android:id="@+id/tv_cardTitle"
android:background="#ffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="#505353"
android:textAlignment="center"
tools:text="Cement Pouring Guy"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/tv_companyName"
android:background="#ffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="#505353"
android:textAlignment="center"
tools:text="ABC Company"
android:layout_gravity="center_horizontal" />
<TextView
android:id="@+id/tv_cardDesc"
android:textSize="14sp"
android:textColor="#505353"
android:background="#e6e7e8"
android:layout_width="match_parent"
android:layout_height="150dp"
android:padding="15dp" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/item_swipe_left_indicator"
android:alpha="0"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_margin="20dp"
android:background="#FFFFFF" />
<View
android:id="@+id/item_swipe_right_indicator"
android:alpha="0"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_margin="20dp"
android:layout_gravity="right"
android:background="#FFFFFF" />
</FrameLayout>
自定义适配器:
public class CustomAdapter extends ArrayAdapter<Card> {
private final Context context;
private final ArrayList<Card> card;
private final int layoutResourceId;
public CustomAdapter(Context context, int layoutResourceId, ArrayList<Card> cards) {
super(context, layoutResourceId, cards);
this.context = context;
this.cards = cards;
this.layoutResourceId = layoutResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) context.getSystemService((Activity.LAYOUT_INFLATER_SERVICE));
if (view == null) {
view = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.title = (TextView)view.findViewById(R.id.tv_cardTitle);
holder.companyname = (TextView)view.findViewById(R.id.tv_companyName);
holder.description = (TextView)view.findViewById(R.id.tv_cardDesc);
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
Card j = cards.get(position);
holder.title.setText(j.getCardTitle());
holder.companyname.setText(j.getCompanyName());
holder.description.setText(j.getDescription());
return view;
}
static class ViewHolder
{
TextView title;
TextView companyname;
TextView description;
}
}
删除所有tv_cardDesc
从活动,包括相关的代码onClickListener
& findViewById
。
像这样更改CustomAdapter
的getView
方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) context.getSystemService((Activity.LAYOUT_INFLATER_SERVICE));
if (view == null) {
view = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.title = (TextView)view.findViewById(R.id.tv_cardTitle);
holder.companyname = (TextView)view.findViewById(R.id.tv_companyName);
holder.description = (TextView)view.findViewById(R.id.tv_cardDesc);
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
Card j = cards.get(position);
holder.title.setText(j.getCardTitle());
holder.companyname.setText(j.getCompanyName());
holder.description.setText(j.getDescription());
// JUST DEFINE THE CLICK LISTENER HERE
holder.description.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//open up a fragment to display the entire carddescription
//makeToast(getApplicationContext(), "Test description click");
Toast.makeText(contex, "Test description click :"+position, Toast.LENGTH_SHORT).show();
}
});
return view;
}
说明:
您已经在
CustomAdapter
为该TextView
完成了findViewByID
,因此无需执行Activity
就可以在这里& 主要要做 :如果您想直接在活动中访问适配器的视图,那么就需要listView的接口实现 。 但是对于您的问题,上述解决方案是最好的!!
像这样编辑您的CustomAdapter
public class CustomAdapter extends ArrayAdapter<Card> {
private final Context context;
private final ArrayList<Card> card;
private final int layoutResourceId;
public CustomAdapter(Context context, int layoutResourceId, ArrayList<Card> cards) {
super(context, layoutResourceId, cards);
this.context = context;
this.cards = cards;
this.layoutResourceId = layoutResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) context.getSystemService((Activity.LAYOUT_INFLATER_SERVICE));
if (view == null) {
view = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.title = (TextView)view.findViewById(R.id.tv_cardTitle);
holder.companyname = (TextView)view.findViewById(R.id.tv_companyName);
holder.description = (TextView)view.findViewById(R.id.tv_cardDesc);
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//your code to do
}
});
holder.companyname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//your code to do
}
});
holder.description.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//your code to do
}
});
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
Card j = cards.get(position);
holder.title.setText(j.getCardTitle());
holder.companyname.setText(j.getCompanyName());
holder.description.setText(j.getDescription());
return view;
}
static class ViewHolder
{
TextView title;
TextView companyname;
TextView description;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.