【问题标题】:Fragment for Image Viewer (Android)图像查看器的片段 (Android)
【发布时间】:2014-06-25 19:00:09
【问题描述】:

我正在尝试创建一个仅在单击时显示图像的简单片段。我遇到了很多错误,包括“对于 ExampleFragment 类型的 findViewbyId(int) 方法未定义”、“Inflater 无法解析”和“imageview_main 无法解析或不是字段”。 imageview_main 是我创建的布局,imageView1 是该布局中包含的图像。这是片段代码:

package com.firstproject.simplemenu;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; 
import android.view.View.OnClickListener;
import android.widget.Button;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;

import android.app.Fragment;
import android.widget.ImageView;

public class ExampleFragment extends Fragment {

Button button;
ImageView image;


public ExampleFragment() {

}

public static ExampleFragment newInstance() {
    return new ExampleFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ImageView imageview = (ImageView)findViewById(R.id.imageView1);
    return Inflater.inflate(R.layout.iamgeview_main, container, false);
    }

public void addListenerOnButton() {


    button = (Button) findViewById(R.id.btnChangeImage);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            image.setImageResource(R.drawable.eagle);
        }

    });

}

【问题讨论】:

    标签: android android-layout android-fragments android-imageview android-image


    【解决方案1】:

    findViewById 是 Activity 类中的一个方法。为避免传递整个活动的实例,请使用 Wea​​kRefence(请参阅 http://developer.android.com/reference/java/lang/ref/WeakReference.html) 例如

    private WeakReference<MainActivity> activity;
    
    public ExampleFragment(MainActivity mainActivity) {
       activity = new WeakReference<MainActivity>(mainActivity);
    } 
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        ImageView imageview = (ImageView)activity.findViewById(R.id.imageView1);
        return Inflater.inflate(R.layout.iamgeview_main, container, false);
    }
    

    【讨论】:

    • 我需要包含一些库吗?当我尝试这个给定的代码时,我在 Inflater、activity、imageview_main 和 WeakReference 上遇到各种错误......
    • 你能发布整个堆栈跟踪吗?
    【解决方案2】:

    我在您的代码中添加了以下修改;

    1) 从支持库导入 Fragment(如果在早期版本的 android 上运行很重要);

    2)Insted of Inflater 我使用收到的inflater作为方法参数;

    3) 我创建了一个可以在这个片段中使用的方法 findViewById;

    4) 我在 onActivityCreated 方法中移动了一些初始化代码; Here

    您可以找到有关该方法的更多信息;

    package com.example.gctest;
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup; 
    import android.view.View.OnClickListener;
    import android.webkit.WebView.FindListener;
    import android.widget.Button;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    
    import android.widget.ImageView;
    
    public class ExampleFragment extends Fragment {
    
    Button button;
    ImageView image;
    
    
    public ExampleFragment() {
    
    }
    
    public static ExampleFragment newInstance() {
        return new ExampleFragment();
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    
            //ImageView imageview = (ImageView)findViewById(R.id.imageView1); this will raise NullPointerException because the parent view has not been created. Is is created with this method;
            return inflater.inflate(R.layout.iamgeview_main, container, false); //just return the  view ;
        }
    
    @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            //here you can initialise your variables,listeners,e.t.c ;
            super.onActivityCreated(savedInstanceState);
    
            ImageView imageview = (ImageView)findViewById(R.id.imageView1);
            addListenerOnButton();
        }
    
    /**
     * You can use this method in order to access the child views of the fragment parent view;
     * @param id
     * @return
     */
    protected View findViewById(int id)
    {
        return getView().findViewById(id);
    }
    
    public void addListenerOnButton() {
    
    
        button = (Button) findViewById(R.id.btnChangeImage);
        button.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                image.setImageResource(R.drawable.eagle);
            }
    
        });
    
    }
    

    【讨论】:

    • 非常感谢!这解决了片段中的错误,但由于某种原因,我的主要活动仍然不允许我调用片段。我收到错误“FragmentTransaction 类型中的方法替换(int,Fragment)不适用于参数(int,ExampleFragment)”:replace(R.id.container,ExampleFragment.newInstance())。 ...有什么想法吗?
    • 1) 确保您的活动扩展了 FragmentActivity,2) 您的替换片段代码如下所示 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(containerResId, ExampleFragment.newInstance());片段交易.commit(); !再次从支持库导入导入android.support.v4.app.FragmentTransaction;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多