【问题标题】:Bitmap is returning null reference object but still image resource is right位图返回空引用对象,但图像资源仍然正确
【发布时间】:2017-06-28 17:47:47
【问题描述】:
b  = BitmapFactory.decodeResource(this.getApplicationContext().getResources(),R.drawable.elon);

我正在尝试创建一个照片效果应用程序,当我使用它创建位图时,它会返回一个空指针异常。

我所做的创建了一个简单的活动,它在底部有回收器视图(水平),在回收器视图上方有一个图像视图。

recycler 视图只有每个必须更改的效果的按钮,添加了一个按钮。当从回收器视图中单击一个按钮时,主类中的一个方法被调用并且必须运行,我的 MainActivity.java 是:

公共类 MainActivity 扩展 AppCompatActivity {

static {
    System.loadLibrary("NativeImageProcessor");
}
Toolbar tl;
ImageView mainImage;
RecyclerView rec;
ArrayList<String> list = new ArrayList<String>();
com.zomato.photofilters.imageprocessors.Filter myFilter;
Drawable b;
Bitmap input;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tl = (Toolbar)findViewById(R.id.toolbar);
    tl.setTitle("Image Effects");
    setSupportActionBar(tl);
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int height = dm.heightPixels;
    int width = dm.widthPixels;
    mainImage = (ImageView)findViewById(R.id.mainImage);
    mainImage.setMinimumHeight((int) (0.6 * height));
    rec= (RecyclerView)findViewById(R.id.rec);
    rec.setLayoutManager(new 
    LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
    list.add("Keep original");
    list.add("Star Lit Filter");
    list.add("Blue Mess Filter");
    list.add("Awe Stuck Vibe Filter");
    list.add("Lime Stutter Filter");
    list.add("Night Whispher Filter");
    HorizontalAdapter ha=new HorizontalAdapter(list);
    rec.setAdapter(ha);
}
public void imageOutput(int filterNum){
    try{
        input = BitmapFactory.decodeResource(getApplicationContext().getResources(),R.mipmap.ic_launcher_round);
    }catch (Exception e){
        Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
    }
    switch (filterNum){
        case 0:
            mainImage.setImageBitmap(input);
            break;
        case 1:
            myFilter = SampleFilters.getStarLitFilter();
            mainImage.setImageBitmap(myFilter.processFilter(input));
            break;
        case 2:
            myFilter = SampleFilters.getBlueMessFilter();
            mainImage.setImageBitmap(myFilter.processFilter(input));
            break;
        case 3:
            myFilter = SampleFilters.getAweStruckVibeFilter();
            mainImage.setImageBitmap(myFilter.processFilter(input));
            break;
        case 4:
            myFilter = SampleFilters.getLimeStutterFilter();
            mainImage.setImageBitmap(myFilter.processFilter(input));
            break;
        case 5:
            myFilter = SampleFilters.getNightWhisperFilter();
            mainImage.setImageBitmap(myFilter.processFilter(input));
            break;
    }
}

}

这是我的 Horizo​​ntalAdapter.java 类:

public class HorizontalAdapter extends 
RecyclerView.Adapter<HorizontalAdapter.myViewHolder> {

ArrayList<String> list;
MainActivity ma = new MainActivity();
HorizontalAdapter(ArrayList list){
    this.list = list;

}


@Override
public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
    return new myViewHolder(v);
}

@Override
public void onBindViewHolder(myViewHolder holder, final int position) {
    holder.filterButton.setText(list.get(position));
    holder.filterButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("exe","1");
            ma.imageOutput(position);
            Log.i("exe","0");
        }
    });
}

@Override
public int getItemCount() {
    return list.size();
}
public class myViewHolder extends RecyclerView.ViewHolder{
    Button filterButton;
    public myViewHolder(View itemView) {
        super(itemView);
        filterButton = (Button)itemView.findViewById(R.id.filterButton);
    }
}

}

这里的 ImageOutput 方法是从水平回收器适配器传递按钮的位置作为参数调用的。 我得到的错误是在 try catch 块中的位图中,将错误显示为空对象引用并崩溃,我在监视器中的错误程序是:

      E/AndroidRuntime: FATAL EXCEPTION: main

  Process: com.example.ag.testphotofilterwithbuttons, PID: 2528

    java.lang.NullPointerException: Attempt to invoke virtual method 
     'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                                         at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107)
                                                                                         at com.example.ag.testphotofilterwithbuttons.MainActivity.imageOutput(MainActivity.java:69)
                                                                                         at com.example.ag.testphotofilterwithbuttons.HorizontalAdapter$1.onClick(HorizontalAdapter.java:38)
                                                                                         at android.view.View.performClick(View.java:5204)
                                                                                         at android.view.View$PerformClick.run(View.java:21153)
                                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 请编辑您的问题并提供来自您的异常的完整 Java 堆栈跟踪。
  • 你完成了!你能检查我犯了什么错误吗??
  • 请将代码发布到HorizontalAdapter,特别是堆栈跟踪中显示的onClick() 方法。您用于imageOutput() 调用的MainActitvity 未正确创建,就像您尝试自己创建MainActivity 的实例一样。
  • 嘿,普通软件!完成包括水平适配器!

标签: android bitmap android-drawable android-bitmap bitmapfactory


【解决方案1】:

改用ContextCompat

ContextCompat.getDrawable(context, R.drawable.elon);

【讨论】:

  • 对不起兄弟,这对我不起作用。感谢您的帮助!
【解决方案2】:
MainActivity ma = new MainActivity();

从不自己创建活动实例。

由于MainActivity 是使用HorizontalAdapter 的那个,因此向HorizontalAdapter 添加一个构造函数参数,该参数采用MainActivity

MainActivity ma;
HorizontalAdapter(MainActivity ma, ArrayList list){
    this.list = list;
    this.ma = ma;
}

MainActivity可以传入this

HorizontalAdapter ha=new HorizontalAdapter(this, list);
rec.setAdapter(ha);

【讨论】:

  • 对不起,我无法正确解决!我能得到确切的代码吗??相反,我创建了一个 MainActivity 实例,我将 imageviiew 和位图传递给了 adpter,并尝试更改图像的效果仍然会使应用程序崩溃。
猜你喜欢
  • 2010-09-14
  • 2011-11-15
  • 2018-03-21
  • 2021-09-03
  • 2011-09-15
  • 2015-07-19
  • 1970-01-01
  • 2016-01-19
  • 2019-11-11
相关资源
最近更新 更多