谁能解释一下这部分代码“((MainActivity)getActivity()).someMethod()”的含义?
Can anyone explain me the meaning of this part of the code "((MainActivity)getActivity()).someMethod()"?
我创建了一个扩展 DialogFragment 的 ListDialog class,但我对 DijalogX 中这段代码的理解有问题 class
((MainActivity)getActivity()).setTextField(selectedItem);
我了解到,通过上面的代码,我将选定的 String 变量作为参数放入 setTextField 方法,之后该变量显示在 MainActivity 的 TextView 中 class。
我的问题:
- 为什么我需要从 getActivity() 到 MainActivity 的强制转换以及如何从 DijalogX(fragment) 访问 MainActivity 中的方法 setTextField?请稍微解释一下这个过程。
- 我也试过代替 ((MainActivity)getActivity()).setTextField(selectedItem)
使用一个接口,一切都很好,我得到了相同的结果,但我想知道这里接口或 ((MainActivity)getActivity()).setTextField(selectedItem)?
有什么更好的解决方案
MainActivity
package com.example.dezox.dijaloglist;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
private Button btnStartDialog;
private TextView tvSelectedOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets();
setupListener();
}
private void initWidgets() {
btnStartDialog = findViewById(R.id.btnDialog);
tvSelectedOption = findViewById(R.id.tvselectedOption);
}
private void setupListener() {
btnStartDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DijalogX dijalogX = new DijalogX();
dijalogX.show(getSupportFragmentManager(), "dx");
tvSelectedOption.setText("");
}
});
}
public void setTextField(String odabrano){
tvSelectedOption.setText(odabrano);
}
public String getTextField(){
return tvSelectedOption.getText().toString();
}
}
DijalogX
package com.example.dezox.dijaloglist;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
public class DijalogX extends DialogFragment {
private String[] languageList;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initListResource();
}
private void initListResource() {
languageList = getResources().getStringArray(R.array.language_list);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),
android.R.style.Theme_Material_Dialog_Alert)
.setTitle("Select Language: ")
.setItems(languageList, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selectedItem = languageList[which];
//THIS PART OF THE CODE I DONT UNDERSTAND:
((MainActivity)getActivity()).setTextField(selectedItem);
}
});
return builder.create();
}
}
您在 MainActivity
中声明了一个名为 setTextField
的方法。如果你打电话
Activity a = getActivity();
您将无法调用您的自定义方法(它在您的派生 class 上,而不是基础 Activity
class)。
a.setTextField(selectedIte); // WON'T WORK - NO SUCH METHOD
如果您改为调用
MainActivity ma = (MainActivity)getActivity();
它现在被转换为您的派生 class 然后您可以调用
ma.setTextField(selectedItem);
像这样分两行执行与在代码中调用单行代码相同
((MainActivity)getActivity()).setTextField(selectedItem);
就转换与接口而言,接口是一种更灵活的方法。如果您尝试在不同的 activity(而不是 MainActivity
)中使用此片段,转换方法将会失败。如果您只打算使用此 Activity 中的片段,那么两者都可以。
我创建了一个扩展 DialogFragment 的 ListDialog class,但我对 DijalogX 中这段代码的理解有问题 class
((MainActivity)getActivity()).setTextField(selectedItem);
我了解到,通过上面的代码,我将选定的 String 变量作为参数放入 setTextField 方法,之后该变量显示在 MainActivity 的 TextView 中 class。
我的问题:
- 为什么我需要从 getActivity() 到 MainActivity 的强制转换以及如何从 DijalogX(fragment) 访问 MainActivity 中的方法 setTextField?请稍微解释一下这个过程。
- 我也试过代替 ((MainActivity)getActivity()).setTextField(selectedItem) 使用一个接口,一切都很好,我得到了相同的结果,但我想知道这里接口或 ((MainActivity)getActivity()).setTextField(selectedItem)? 有什么更好的解决方案
MainActivity
package com.example.dezox.dijaloglist;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
private Button btnStartDialog;
private TextView tvSelectedOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets();
setupListener();
}
private void initWidgets() {
btnStartDialog = findViewById(R.id.btnDialog);
tvSelectedOption = findViewById(R.id.tvselectedOption);
}
private void setupListener() {
btnStartDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DijalogX dijalogX = new DijalogX();
dijalogX.show(getSupportFragmentManager(), "dx");
tvSelectedOption.setText("");
}
});
}
public void setTextField(String odabrano){
tvSelectedOption.setText(odabrano);
}
public String getTextField(){
return tvSelectedOption.getText().toString();
}
}
DijalogX
package com.example.dezox.dijaloglist;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
public class DijalogX extends DialogFragment {
private String[] languageList;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initListResource();
}
private void initListResource() {
languageList = getResources().getStringArray(R.array.language_list);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),
android.R.style.Theme_Material_Dialog_Alert)
.setTitle("Select Language: ")
.setItems(languageList, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selectedItem = languageList[which];
//THIS PART OF THE CODE I DONT UNDERSTAND:
((MainActivity)getActivity()).setTextField(selectedItem);
}
});
return builder.create();
}
}
您在 MainActivity
中声明了一个名为 setTextField
的方法。如果你打电话
Activity a = getActivity();
您将无法调用您的自定义方法(它在您的派生 class 上,而不是基础 Activity
class)。
a.setTextField(selectedIte); // WON'T WORK - NO SUCH METHOD
如果您改为调用
MainActivity ma = (MainActivity)getActivity();
它现在被转换为您的派生 class 然后您可以调用
ma.setTextField(selectedItem);
像这样分两行执行与在代码中调用单行代码相同
((MainActivity)getActivity()).setTextField(selectedItem);
就转换与接口而言,接口是一种更灵活的方法。如果您尝试在不同的 activity(而不是 MainActivity
)中使用此片段,转换方法将会失败。如果您只打算使用此 Activity 中的片段,那么两者都可以。