使用getActivity

时间:2014-02-11 20:23:06

标签: android android-fragments android-fragmentactivity android-dialogfragment

首先很抱歉,如果这篇文章看似重复,但我对Android编程非常陌生,并且只有当我仍然无法获得使用getActivity的满意答案时才发布此问题。

理论上我从这里的几个帖子中理解了getActivity()的使用,但我很困惑它在我的代码中是如何工作的。

我有一个类MainActivity,我正在创建一个对话框,只需单击一个复选框。 我有另一个TaxDialog类,其中实现了对话框。单击是/否按钮,我在MainActivity类中调用方法定义。  以下是代码:

MainActivty

    import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;



public class MainActivity extends ActionBarActivity implements View.OnClickListener, View.OnFocusChangeListener {

// onCheck of checkbox showNoticeDialog is called

    public void showNoticeDialog() {
        // Create an instance of the dialog fragment and show it
        Log.i("MyActivity", "Inside showNoticeDialog");
        DialogFragment dialog = new TaxDialog();
        Bundle args = new Bundle();
        args.putString("title", "Test");
        args.putString("message", "Test Message");
        dialog.setArguments(args);

        dialog.show(getSupportFragmentManager(), "dialog");


    }
   public void doPositiveClick(){
       Log.i("MyActivity", "Inside +ve");
   }
    public void doNegativeClick(){
        Log.i("MyActivity", "Inside -ve");
    }

}

TaxDialog

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;

public class TaxDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Bundle args = getArguments();

        String title = args.getString("title");

        String message = args.getString("message");
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(title);

        builder.setMessage(message);
        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                Log.i("MyActivity", "Expected fault area.");
                ((MainActivity) getActivity()).doPositiveClick();
            }
        });
        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ((MainActivity) getActivity()).doNegativeClick();
            }
        });
        builder.create();

        return builder.create();
    }

}

在这里,我想了解以下行如何工作

((MainActivity) getActivity()).doPositiveClick();

还请让我知道做同样事情的其他方式(比如MainActivity.this.getActivity()或其他东西)。

非常感谢。

修改

谢谢大家。可能我错误地提出了这个问题。我唯一怀疑的是getActivity()如何返回Activity引用。现在我明白了。

4 个答案:

答案 0 :(得分:4)

让我们把它分开:

  • getActivity()可以在片段中用于获取Activity的父Fragment(基本上是显示片段的活动)。

  • ((MainActivity) getActivity())另外将getActivity()的结果转换为MainActivity。通常,您只知道getActivity()返回类型为Activity的对象,但使用此强制转换,您告诉编译器您确定该对象是{的特定子类{1}},即Activity。您需要在您的情况下执行此操作,因为MainActivity仅在doPositiveClick()中实现,而不在MainActivity中实现,因此您必须向编译器保证对象是Activity ,它将响应方法MainActivity

  • doPositiveClick()只是在doPositiveClick()返回的MainActivity对象上调用该方法。

答案 1 :(得分:3)

您使用的方法并不是完成您想要做的事情的最佳方式。 Android对侦听器以及与片段进行通信提供了很好的支持。因此,让我们看看如何沟通片段 - >活动方向。

首先,您需要根据对话框中的内容使您的MainActivity成为一个监听器,因此最好的方法是在 MainActivity 上实现 DialogInterface.OnClickListener ,覆盖 onClick(DialogInterface对话框,int which)方法,将从您的fragmen中调用此方法。所以到目前为止,一切都在您的MainActivity中完成。

现在,在您的片段中,您必须覆盖 onAttach(活动活动)方法,这是构建片段时调用的第一个方法,此方法随父活动一起提供,在此方法内部初始化片段的监听器(您的MainActivity)。

您的片段应如下所示:

private DialogInterface.OnClickListener listener;


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Bundle args = getArguments();

    String title = args.getString("title");

    String message = args.getString("message");
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(title);

    builder.setMessage(message);
    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            //Calling our MainActivity Listener with a positive answer
            listener.onClick(getDialog(), 1);
        }
    });
    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            //Calling our MainActivity Listener with a negative answer
            listener.onClick(getDialog(), 0);
        }
    });
    builder.create();

    return builder.create();
}

@Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof DialogInterface.OnClickListener) {
      listener = (DialogInterface.OnClickListener) activity;
    } else {
      throw new ClassCastException(activity.toString()
          + " must implemenet DialogInterface.OnClickListener");
    }
  }

您的主要活动onClick()方法应如下所示:

@Override
public void onClick(DialogInterface dialog, int which) {

    switch (which) {
    case 0:
        //Do your negative thing
        break;

    case 1:
        //Do your positive thing
        break;
    }

    Toast.makeText(this, "You clicked "+ which, Toast.LENGTH_SHORT).show();

}

这是做你想做的最好的方法,忘记“硬”投射你的MainActivity类。希望它能帮到你!

答案 2 :(得分:0)

我相信你可以做到

  this.doPsitiveClick();

((MainActivity)getActivity())只是获取当前活动活动并将其转换为MainActivity ..

答案 3 :(得分:0)

当您使用fragments时,它只是获取上下文的方法。如上所述,您使用的是DialogFragment,而OnClickListener则需要使用上下文。

  • getActivity()是用户定义的。
  • public final Activity getActivity() - 返回此片段当前与之关联的活动。

对于您的代码,TaxDialog扩展DialogFragment需要使用上下文创建AlertDialog AlertDialog.Builder。因此,getActivity()AlertDialog.Builder作为context中的参数传递为AlertDialog,告诉{{1}}片段它附加到哪个活动。