Android studio Fragment onAttach。 onAttach会发生什么?

时间:2017-07-16 12:54:07

标签: android android-fragments

我一直在学习android studio中的片段。 这是我一直在阅读的内容 Click  和Click.

我写了这个简单的代码。单击片段(frag.xml)中的按钮时,将显示文本(activity_main.xml)。代码工作正常,但我无法理解onAttach中发生了什么。有人可以用简单的方法解释一下这个关于代码的问题吗?我得到了trycatch和sout消息,但是否则我迷路了。

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    try{
        st =(setText) context;
    }catch (Exception e){
        System.out.println("Virhe " + e);
    }
}

以下是代码的其余部分

import android.content.Context;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class interExample extends Fragment {

setText st;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frag,container,false);
    Button bt =(Button) view.findViewById(R.id.button);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            st.text("fragone pressed");
        }
    });
    return view;
}




public interface setText{
    void text(String text);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    try{
        st =(setText) context;
    }catch (Exception e){
        System.out.println("Virhe " + e);
    }
}

这是MainActivity

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.widget.TextView;

public class MainActivity extends FragmentActivity implements interExample.setText{

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

    Fragment f1 = new interExample();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.line1,f1);
    ft.commit();
}


@Override
public void text(String t){
    TextView tv = (TextView) findViewById(R.id.textview);
    tv.setText(t);
}}

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

您可以看到您的MainActivity工具interExample.setText是您在片段中定义的界面。 这意味着您的MainActivity将在setText接口内实现该方法(定义它们的作用)。

现在让我们直接讨论关于onAttach()的主要问题,这个方法是在第一次调用片段时调用的。 (看一下片段生命周期)

在此onAttach()中有类似

的代码
try{
   st =(setText) context;
}catch (Exception e){
   System.out.println("Virhe " + e);
}

此处代码试图说我们正在将context传递给st

进一步简化它将传递给调用此片段的任何活动(context,因为Activity是一个上下文)到st MainActivity正在调用此片段,因此此处MainActivityst

注意:(setText)只是将context转换为setText,因此此处的活动将充当setText

那么我们可以使用MainActivity执行ini st方法,因为我们已经在MainActivity

中实现了它们