在 ArrayAdapter 中启动片段
Starting a Fragment Inside ArrayAdapter
我有一个用 ArrayAdapter 填充的 gridview。在 GridView 中,我有一个 Button 和 ImageView。我为按钮和图像创建了一个监听器,但是我想在点击 ImageView 后启动一个片段。我在使用 getSupportFragmentManager() 时遇到了错误;。
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
更新
这是我的 ArrayAdapter 代码 Class
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.util.List;
public class MyAdapter extends ArrayAdapter<RowItem> {
Context context;
int imgId;
public MyAdapter(Context context, int resourceId, List<RowItem> items){
super(context, resourceId, items);
this.context = context;
}
private class ViewHolder{
ImageView imageView;
Button btn;
TextView textView;
}
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
RowItem rowItem = getItem(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null){
convertView = inflater.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.img);
holder.btn = (Button) convertView.findViewById(R.id.btnPocket);
holder.textView = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
Picasso.with(context)
//.load("http://www.balay-indang.com/megamobile/pics/"+ String.valueOf(position+1) +".png")
.load(rowItem.getImgUrl())
.resize(200,150)
.centerCrop()
.into(holder.imageView);
holder.textView.setText(rowItem.getText());
holder.btn.setBackgroundResource(rowItem.getPocketId());
final String pos = String.valueOf(position);
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "Pocket: "+ pos, Toast.LENGTH_LONG).show();
}
});
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
return convertView;
}
}
你现在的activity是"Fragment"activity吗?
您的 activity 需要扩展并且 Activity 继承自 FragmentActivity 以获得 getSupportFragmentManager() 和其他支持方法可用的。
在我回答时,您的 activity 应该扩展 AppCompatActivity。还要确保相关导入使用类如
的支持
android.support.v4.app.FragmentManager
您只能从 FragmentActivity class 访问 getSupportedFragmentManager。
如果您必须在适配器中访问 getSupportedFragmentManager,那么您已经通过构造函数传递了 activity 的实例。
getSupportFragmentManager() 仅为 class FragmentActivity 定义。
编辑:
如果您的 MainActivity 扩展了 ActionBarActivity,那么试试这个。
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = ((ActionBarActivity) context).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
希望对您有所帮助!
我有一个用 ArrayAdapter 填充的 gridview。在 GridView 中,我有一个 Button 和 ImageView。我为按钮和图像创建了一个监听器,但是我想在点击 ImageView 后启动一个片段。我在使用 getSupportFragmentManager() 时遇到了错误;。
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
更新
这是我的 ArrayAdapter 代码 Class
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.util.List;
public class MyAdapter extends ArrayAdapter<RowItem> {
Context context;
int imgId;
public MyAdapter(Context context, int resourceId, List<RowItem> items){
super(context, resourceId, items);
this.context = context;
}
private class ViewHolder{
ImageView imageView;
Button btn;
TextView textView;
}
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
RowItem rowItem = getItem(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null){
convertView = inflater.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.img);
holder.btn = (Button) convertView.findViewById(R.id.btnPocket);
holder.textView = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
Picasso.with(context)
//.load("http://www.balay-indang.com/megamobile/pics/"+ String.valueOf(position+1) +".png")
.load(rowItem.getImgUrl())
.resize(200,150)
.centerCrop()
.into(holder.imageView);
holder.textView.setText(rowItem.getText());
holder.btn.setBackgroundResource(rowItem.getPocketId());
final String pos = String.valueOf(position);
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "Pocket: "+ pos, Toast.LENGTH_LONG).show();
}
});
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
return convertView;
}
}
你现在的activity是"Fragment"activity吗?
您的 activity 需要扩展并且 Activity 继承自 FragmentActivity 以获得 getSupportFragmentManager() 和其他支持方法可用的。
在我回答时,您的 activity 应该扩展 AppCompatActivity。还要确保相关导入使用类如
的支持android.support.v4.app.FragmentManager
您只能从 FragmentActivity class 访问 getSupportedFragmentManager。 如果您必须在适配器中访问 getSupportedFragmentManager,那么您已经通过构造函数传递了 activity 的实例。
getSupportFragmentManager() 仅为 class FragmentActivity 定义。
编辑:
如果您的 MainActivity 扩展了 ActionBarActivity,那么试试这个。
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = ((ActionBarActivity) context).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
DetailsFragment fragment = new DetailsFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
});
希望对您有所帮助!