java - 从 fragment 访问主要 Activity View

标签 java android android-fragments android-activity

我有一个 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/

相关文章:

java - GWTP Eclipse 插件生成空演示者

java - LeetCode Java 两道求和题

java - 新 fragment 在白色背景上过渡而不是旧 fragment

android - 如何从底部动画 fragment

java - onCreateView 在 fragment 方法运行之前未调用

java - 为什么 eclipse 氧气无法启动(第一次)?

java - 在java中计算日期/时间差

android - 为 Android Studio 项目添加 JS 和 CSS 支持

android - 操作栏填充

android - 如何将 WebView 添加到 Widget 中?