首先很抱歉,如果这篇文章看似重复,但我对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引用。现在我明白了。
答案 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
则需要使用上下文。
public final Activity getActivity()
- 返回此片段当前与之关联的活动。对于您的代码,TaxDialog
扩展DialogFragment
需要使用上下文创建AlertDialog
AlertDialog.Builder
。因此,getActivity()
中AlertDialog.Builder
作为context
中的参数传递为AlertDialog
,告诉{{1}}片段它附加到哪个活动。