即使设置了cancellable true,自定义对话框也不会取消

时间:2015-06-30 06:05:36

标签: java android eclipse android-studio

我有一个自定义的ActivityIndi​​cator定义为此

public class ActivityIndicator extends Dialog
{
    private ImageView progress;
    private ImageView bottomProgress;

    private int type = INDICATOR_SIMPLE;

    public static final int INDICATOR_SIMPLE = 0;
    public static final int INDICATOR_BOTTOM = 1;

    public ActivityIndicator(Context context, int theme, int type)
    {
        super(context, theme);
        this.type = type;
        onCreate(null);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_indicator);

        progress = (ImageView) findViewById(R.id.progress);
        bottomProgress = (ImageView) findViewById(R.id.bottomProgress);

        if(type == INDICATOR_BOTTOM)
        {
            progress.setVisibility(View.INVISIBLE);
        }
        else if(type == INDICATOR_SIMPLE)
        {
            bottomProgress.setVisibility(View.INVISIBLE);
        }
        this.setCancelable(false);
    }

    @Override
    public void show()
    {
        progress.clearAnimation();
        bottomProgress.clearAnimation();

        if(type == INDICATOR_BOTTOM)
        {
            progress.setVisibility(View.INVISIBLE);
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.rotating_img);
                    bottomProgress.startAnimation(anim);
                }
            },400);
        }

        if(type == INDICATOR_SIMPLE)
        {
            bottomProgress.setVisibility(View.INVISIBLE);
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.rotating_img);
                    progress.startAnimation(anim);
                }
            },400);
        }
        super.show();
    }

    @Override
    public void dismiss()
    {
        super.dismiss();
        progress.clearAnimation();
        bottomProgress.clearAnimation();
    }
}

在我的活动中,我将其初始化为:

        indicator = new ActivityIndicator(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen, ActivityIndicator.INDICATOR_SIMPLE);

现在如代码所示,默认样式cancelable为false。

但是在某些时候我确实想把它取消,这是我的代码:

        indicator.setCancelable(true);
        indicator.setOnCancelListener(new DialogInterface.OnCancelListener()
        {
            @Override
            public void onCancel(DialogInterface dialog)
            {
                finish();
            }
        });
indicator.show();

当我尝试按后退按钮时,没有任何反应,dialog没有取消也没有取消听众。这有什么不对?为什么不按下后退键自动取消

4 个答案:

答案 0 :(得分:2)

请勿Override onCreate()。您调用的onCreate(null)方法正在搞砸您的代码。而是使用初始化模式初始化Dialog

如果您将onCreate更改为initialize()并从构造函数中调用该代码,则代码将起作用。

请看以下内容。

public ActivityIndicator(Context context, int theme, int type)
{
    super(context, theme);
    this.type = type;

    initialize();
}

protected void initialize()
{
    setContentView(R.layout.dialog_indicator);
    setCancelable(false);

    progress = (ImageView) findViewById(R.id.progress);
    bottomProgress = (ImageView) findViewById(R.id.bottomProgress);

    if(type == INDICATOR_BOTTOM)
    {
        progress.setVisibility(View.INVISIBLE);
    }
    else if(type == INDICATOR_SIMPLE)
    {
        bottomProgress.setVisibility(View.INVISIBLE);
    }
}

答案 1 :(得分:1)

请评论您的seton取消标签并使用以下代码并检查。

indicator.setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            finish();
        }
    }
}

答案 2 :(得分:0)

当您创建ActivityIndicator的实例时,在OnCreate方法中,setCancelable设置为false。

尝试删除..

答案 3 :(得分:0)

你遇到问题只需更改下面的构造函数,你就会得到你的取消列表:

public ActivityIndicator(Context context, int theme, int type, boolean isCancelable)
    {
        super(context, theme);
        this.type = type;
        onCreate(null);
        this.setCancelable(isCancelable); //setcancelable here on the basis of boolean value and remove setcancelable from onCreate()
    }

使用另一个参数(布尔值为true / false

)调用构造函数

注意:不要忘记从setCancelable()方法移除onCreate()