gpt4 book ai didi

java - 从 fragment 访问主要 Activity View

转载 作者:行者123 更新时间:2023-12-01 21:55:04 25 4
gpt4 key购买 nike

我有一个 Activity ,其中包含包含 fragment 的容器,并且该 fragment 具有其他 fragment 。

现在我希望第二个或子 fragment 访问主 Activity 中的 View ,但它返回空指针异常。

类别:

public class ImageListFragment extends AbsListViewBaseFragment   implements  ObservableScrollViewCallbacks {

public static final int INDEX = 0;




android.support.design.widget.FloatingActionButton mFab;

@Bind(R.id.ic_call)
ImageView mIcCall;
@Bind(R.id.ic_email)
ImageView mIcEmail;
@Bind(R.id.ic_forum)
ImageView mIcForum;
FabToolbar mFabToolbar;
ObservableListView mObservableListView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fr_image_list, container, false);
listView = (ListView) rootView.findViewById(android.R.id.list);
((ListView) listView).setAdapter(new ImageAdapter(getActivity()));

final SubTaB mainActivity = (SubTaB)getActivity();
ButterKnife.bind(mainActivity);
//////////////// problem here
mFabToolbar = (FabToolbar) rootView.findViewById(R.id.fabtoolbar);
////////////////
getFragmentManager().findFragmentByTag("TAG");
// rootView.findViewById(R.id.fab);
mObservableListView = (ObservableListView)rootView.findViewById(android.R.id.list);
//


mObservableListView.setAdapter(this.listView.getAdapter());
mObservableListView.setScrollViewCallbacks(this);



mainActivity.mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mainActivity.getApplicationContext(), "msg msg", Toast.LENGTH_LONG).show();
mainActivity.mFabToolbar.expandFab();
}
});



listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

startImagePagerActivity(position);
}
});
return rootView;
}

@Override
public void onDestroy() {
super.onDestroy();
AnimateFirstDisplayListener.displayedImages.clear();
}

private static class ImageAdapter extends BaseAdapter {

private static final String[] IMAGE_URLS = Constants.IMAGES;

private LayoutInflater inflater;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

private DisplayImageOptions options;

ImageAdapter(Context context) {
inflater = LayoutInflater.from(context);

options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) // تغيير الفيو قبل تحميل الصورة
.showImageForEmptyUri(R.drawable.ic_empty) // لما الصورة فاضية
.showImageOnFail(R.drawable.ic_error) // عند الفشل
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new CircleBitmapDisplayer(Color.WHITE, 5))
.build();
}

@Override
public int getCount() {
return IMAGE_URLS.length;
}

@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
if (convertView == null) {
view = inflater.inflate(R.layout.item_list_image, parent, false);
holder = new ViewHolder();
holder.text = (TextView) view.findViewById(R.id.text);
holder.image = (ImageView) view.findViewById(R.id.image);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}

holder.text.setText("Item " + (position + 1));



ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);

return view;
}
}

static class ViewHolder {
TextView text;
ImageView image;
}



@Override
public void onScrollChanged(int i, boolean b, boolean b1) {

}

@Override
public void onDownMotionEvent() {

}

@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
Log.d("","Scroll scroll scroll");

if (scrollState == ScrollState.UP) {
mFabToolbar.slideOutFab();
} else if (scrollState == ScrollState.DOWN) {
mFabToolbar.slideInFab();
}
}

@OnClick(R.id.fab)
void onFabClick() {
mFabToolbar.expandFab();
}

@OnClick(R.id.call)
void onClickCall() {
iconAnim(mIcCall);
}

@OnClick(R.id.ic_email)
void onClickEmail() {
iconAnim(mIcEmail);
}

@OnClick(R.id.ic_forum)
void onClickForum() {
iconAnim(mIcForum);
}

private void iconAnim(View icon) {
Animator iconAnim = ObjectAnimator.ofPropertyValuesHolder(
icon,
PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f, 1f),
PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f, 1f));
iconAnim.start();
}







private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}
}

最佳答案

以这种方式查找和控制 View 并不是一个好的做法。 View 很容易与 Activity 分离并导致意外异常。

如果需要,您应该考虑使用回调在 fragment 和 Activity 之间进行通信。这样,它还能将您的代码保留在正确的位置 - 因此该 Activity 是唯一触及其自己的 View 的 Activity ,并且该 fragment 也仅触及其自己的 View 。它只是告诉 Activity (通过回调)发生了 Activity 可能想知道的事情。它还确保 fragment 是完全独立的并且可以轻松地重复使用。

您可以在此处阅读有关如何实现回调的信息:http://developer.android.com/training/basics/fragments/communicating.html

关于java - 从 fragment 访问主要 Activity View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34496797/

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