【问题标题】:Can anyone explain me the meaning of this part of the code "((MainActivity)getActivity()).someMethod()"?谁能解释一下这部分代码“((MainActivity)getActivity()).someMethod()”的含义?
【发布时间】:2018-07-28 23:12:34
【问题描述】:

我创建了一个扩展 DialogFragment 类的 ListDialog,但我在理解 DijalogX 类中的这段代码时遇到了问题

((MainActivity)getActivity()).setTextField(selectedItem);

我了解到,通过上面的这段代码,我将选定的 String 变量作为参数放入 setTextField 方法中,然后此变量显示在 MainActivity 类的 TextView 中。

我的问题:

  • 为什么我需要从 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();
    }


}

【问题讨论】:

  • 这意味着写它的人不明白如何创建接口和分离关注点,所以他写了一些你不应该复制的非常糟糕的代码。
  • 这里是理解这个的开始:stackoverflow.com/questions/23414090/…

标签: android interface casting android-alertdialog android-dialogfragment


【解决方案1】:

您在MainActivity 中声明了一个名为setTextField 的方法。如果你打电话给

Activity a = getActivity();

您将无法调用您的自定义方法(它在您的派生类上,而不是基类Activity 上)。

a.setTextField(selectedIte); // WON'T WORK - NO SUCH METHOD

如果你调用

MainActivity ma = (MainActivity)getActivity();

它现在被转换为您的派生类,然后您可以调用

ma.setTextField(selectedItem);

像这样在两行中执行它与在代码中调用单行相同

((MainActivity)getActivity()).setTextField(selectedItem);

就转换与接口而言,接口是一种更灵活的方法。如果您尝试在不同的活动(不是MainActivity)中使用此片段,则转换方法将失败。如果您只打算在此 Activity 中使用片段,那么任何一个都可以。

【讨论】:

  • 您的回答非常有用,但我对这种情况还有其他问题:-当我输入此代码“Activity activity = getActivity();”并在 logCat 上的 Log.v 中显示时,我得到了这个:“com.example.dezox.dijaloglist.MainActivity@35d9682d”,但如果我尝试这个而不强制转换“MainActivity ma = getActivity();”我收到一个错误:com.example.dezox.dijaloglist.MainActivity,找到:android.support.v4.app.FragmentActivity。为什么 getActivity 不返回干净的 MainActivity,为什么我需要在这里转换?
  • 第一个命令在日志中打印的内容显示了对象 (MainActivity) 的最终形式,即使变量被强制转换为 Activity。第二种语法 (MainActivity ma = getActivity();) 无效。 getActivity() 返回一个 Activity 并且它不会隐式转换。 This 也有一些不错的阅读资料可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
相关资源
最近更新 更多