【问题标题】:How to change the image of a ImageView from DialogFragment如何从 DialogFragment 更改 ImageView 的图像
【发布时间】:2014-03-18 11:19:49
【问题描述】:

所以基本上我有一个片段类,我有一个 ImageView,我还没有设置任何图像。所以我想从我有列表的对话框中执行此操作,然后单击任何项​​目以将图像添加到 ImageView 所在的片段中。该图像是在 xml 文件中制作的矩形。如果我从它的类中添加它,它可以工作的 Fragment 类。但我需要它从对话框中添加它。

我尝试了一整天,但没有任何效果,我得到的只是 nullPointerException,在我尝试以我尝试的所有方式调用图像添加的同一个地方。

这是我尝试了很多之后得到的代码:)。

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.ImageView;

public class BrickMessageBoxGreen extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.dialog_title_green);
        builder.setItems(R.array.greenBricks_array,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // The 'which' argument contains the index position
                        // of the selected item
                        Arkitektur ark = new Arkitektur();
                        ImageView img = (ImageView)ark.getView().findViewById(R.id.green_brick);
                        ark.addGreenBrick(img);
                    }
                });
        return builder.create();
    }
}

这是我拥有 ImageView 的类:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnDragListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class Arkitektur extends Fragment implements OnTouchListener, OnDragListener {

    private int _xDelta;
    private int _yDelta;
    ViewGroup _root;
    private View arkitektur;

    ImageView greenBrick;
    ImageView redBrick;
    ImageView yellowBrick;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        arkitektur = inflater.inflate(R.layout.arkitektur, container, false);
        //arkitektur.findViewById(R.id.green_brick).setOnTouchListener(this);
        //greenBrick = (ImageView) arkitektur.findViewById(R.id.green_brick);
        //arkitektur.findViewById(R.id.root).setOnDragListener(this);
        //arkitektur.findViewById(R.id.bottom_container).setOnDragListener(this);

        //addGreenBrick();

        _root = (ViewGroup) arkitektur.findViewById(R.id.root);
        _root.setOnDragListener(this);

        return arkitektur;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        final int X = (int) event.getRawX()*2;
        final int Y = (int) event.getRawY()*2;
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
                _xDelta = X - lParams.leftMargin;
                _yDelta = Y - lParams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
                layoutParams.leftMargin = X - _xDelta;
                layoutParams.topMargin = Y - _yDelta;
//              layoutParams.rightMargin = -250;
//              layoutParams.bottomMargin = -250;
                v.setLayoutParams(layoutParams);
                break;
        }
        _root.invalidate();
        return true;
    }

    @Override
    public boolean onDrag(View v, DragEvent e) {
        if (e.getAction()==DragEvent.ACTION_DROP) {
            View view = (View) e.getLocalState();
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            LinearLayout to = (LinearLayout) v;
            to.addView(view);
            view.setVisibility(View.VISIBLE);
        }
        return true;
    }

    public void addGreenBrick(View v)
    {
        v.findViewById(R.id.green_brick).setOnTouchListener(this);
        greenBrick = (ImageView) v.findViewById(R.id.green_brick);
        greenBrick.setImageResource(R.drawable.green_brick);
    }
}

谢谢!

【问题讨论】:

    标签: android android-fragments android-imageview android-dialogfragment


    【解决方案1】:

    我同意 Tamilselvan Kalimuthu,只需让您的片段实现一个侦听器并将其设置为 BrickMessageBoxGreen 类的属性即可。

    编辑:

    添加了一些代码来阐明这个想法。

    BrickMessageBoxGreen 类:

    public OnClickDialogListener listener //Attribute of your class
    
    public void setDialogListener(OnClickDialogListener  l){ //Setting the listener
        this.listener = l;
    }
    
    
    new DialogInterface.OnClickListener() { //Changing onClick method
                        public void onClick(DialogInterface dialog, int which) {
                            // The 'which' argument contains the index position
                            // of the selected item
                this.listener.onDialogClicked("green");
                        }
                    });
    

    Arkitektur 类:

    public interface OnClickDialogListener { //Your listener definition, you could place it elsewhere
        void onDialogClicked(String colorName);
    }
    
    public class Arkitektur extends Fragment implements OnTouchListener, OnDragListener, OnClickDialogListener  { //Implementing your listener interface
    
    public void onDialogClicked(String colorName){//Method implementation
    if(colorName.equals("green")){
        addGreenBrick();
    }else if(colorName.equals("red")){
        addRedBrick();
    }else if(colorName.equals("yellor")){
        addYellowBrick();
    }
    }
    

    【讨论】:

    • 我实现了接口和一切,但仍然得到该行的空异常:ImageView img = (ImageView)getView().findViewById(R.id.green_brick);
    • 嗨 Tacx,我编辑了我的代码,现在你只是传递了应该更改为片段的颜色,请看一下
    • 这令人难以置信,仍然给我空异常:D ...对于同一行:this.listener.onDialogClicked("green");
    • 你在设置监听器吗?似乎 this.listener == null,请始终调试您的代码并对其进行测试。为了改进我的答案,我需要知道您为什么要创建这样的应用程序,您是否已经有 OOP 背景?
    • 这是我学校的应用程序(Android 开发 - 所以我是 Android SDK 的新手,直到现在我更多地使用 C#),我被困在这里。我需要有多个选项卡,并且在每个选项卡上都能够使用数组中的文本添加砖块(图纸),然后您从我添加单词列表的对话框中选择该单词。我希望能够在用户当前所在的片段(标签)上添加绘图(砖)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多