如何检索我的片段类的实例,以便我可以调用它的方法?

时间:2016-08-03 16:07:20

标签: android android-fragments

我正在学习如何使用片段,在我的MainActivity.java中我有这个:

# load library and change to data.table
library(data.table)
setDT(df)

# subset 
df[valence==0 & shift(valence == -1, type="lead"), .SD, by=SubID]
   SubID location valence reaction_time
1:     1        1       0           500
2:     2        1       0           400

如果我尝试将依赖项直接注入到片段的构造函数中,Android Studio就会咆哮。所以我正在尝试这种方法,但是在调试时我会到达设置frag的位置,它只是null并且始终为null。所以,我想我需要知道的是,以最简单的方式,我如何调用我的doInject(b)并将b注入我的片段?

另一件事,我不确定,是后来如果我在同一个MainActivity.java文件中有一个监听器,并且我想用新内容更新片段,我希望做这样的事情:

df <- read.table(header=T, text="SubID location valence reaction_time
1     1        0       500
1     1       -1       600
1     0        1       400
1     0        0       500
2     1        1       700
2     1        0       400
2     0       -1       700
2     0        0       400")

但我有一种感觉,我也会遇到问题。所以我需要一些帮助来理解我正在尝试做什么。我已经花了至少5个小时来解决这个问题,并且需要一些帮助!

编辑以显示布局文件:

activity_main.xml中

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

    A a = new A();

    B b = new B(a);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new ContentFragment())
                .commit();
        ContentFragment frag = (ContentFragment) getSupportFragmentManager()
                .findFragmentById(R.id.container);
        frag.doInject(b);
    }
}

fragment_main.xml

@Override
public void handleResponseData(String s) {
    frag.updateTextbox(s);
}

4 个答案:

答案 0 :(得分:0)

  

如果我尝试将依赖项直接注入片段的构造函数

我不确定doInject方法,但您应该阅读Best practice for instantiating a new Android Fragment

例如,

ContentFragment frag = ContentFragment.newInstance(b);
getSupportFragmentManager().beginTransaction()
            .add(R.id.container, frag, "TAG")
            .commit();
// frag.doInject(b); // Can do, but not necessary
  

稍后如果我在同一个MainActivity.java文件中有一个监听器,并且我想用新内容更新该片段,我希望能做到这样的事情

一般来说,这不是你怎么做的。

frag.updateTextbox(s);

我假设你通过一个handleResponseData(String s)的监听器将活动附加到片段,你必须这样做

String s = "foo";
if (listener != null) {
    listener.handleResponseData(s);
}

因此,而不是那样,你只需要这样做

String s = "foo";
updateTextbox(s);
/*
if (listener != null) {
    listener.handleResponseData(s);
}
*/

答案 1 :(得分:0)

而不是新的ContentFragment()。创建片段并为其指定标记。

示例示例:

if (savedInstanceState == null) {
            ContentFragment fragment = new ContentFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, fragment,"MyFragTag")
                    .commit();
            ContentFragment frag = (ContentFragment) getSupportFragmentManager()
                    .findFragmentByTag("MyFragTag");
            frag.doInject(b);
        }

答案 2 :(得分:0)

(这是最常用的方法)想象一下这是你的片段:

public class FactoryMethodFragment extends Fragment {
    public static final String ARG_MY_VALUE = "any value";

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Bundle arguments = getArguments();
        String myValue = "empty";

        if (arguments != null) {
            myValue = arguments
                    .getString(ARG_MY_VALUE);
        }

        Toast.makeText(getContext(), myValue,
                Toast.LENGTH_SHORT).show();

    }

    public static FactoryMethodFragment getInstance(String myValue){
        FactoryMethodFragment factoryMethodFragment 
                = new FactoryMethodFragment();

        Bundle arguments = new Bundle();
        arguments.putString(ARG_MY_VALUE, myValue);

        factoryMethodFragment.setArguments(arguments);

        return factoryMethodFragment;
    }
}

您必须使用参数创建一个工厂方法,如我的示例所示,并使用它:

getSupportFragmentManager().beginTransaction()
                .add(R.id.container,   FactoryMethodFragment.getInstance("myArgument"))
                .commit();

对于片段和活动之间的通信,我们通常使用如下接口:

public class FactoryMethodFragment extends Fragment {
    public static final String ARG_MY_VALUE = "any value";

    public interface CommunicationChannel {
        void onAction1(String argument);
        void onAction2(String argument);
    }

    private CommunicationChannel mCallback;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Bundle arguments = getArguments();
        String myValue = "empty";

        if (arguments != null) {
            myValue = arguments
                    .getString(ARG_MY_VALUE);
        }

        Toast.makeText(getContext(), myValue,
                Toast.LENGTH_SHORT).show();


        //Here we will send data to the activity
        mCallback.onAction1("data sent to activity");
        mCallback.onAction2("Another data sent to activity");

    }

    public static FactoryMethodFragment getInstance(String myValue){
        FactoryMethodFragment factoryMethodFragment
                = new FactoryMethodFragment();

        Bundle arguments = new Bundle();
        arguments.putString(ARG_MY_VALUE, myValue);

        factoryMethodFragment.setArguments(arguments);

        return factoryMethodFragment;
    }

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

        if (context instanceof Activity) {
            mCallback = (CommunicationChannel) context;
        }
    }
}

你在这样的活动上实现它:

public class FatoryMethodActivity extends AppCompatActivity implements FactoryMethodFragment.CommunicationChannel {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.id.yourlayout);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container,   FactoryMethodFragment.getInstance("myArgument"))
                    .commit();
        }
    }

    @Override
    public void onAction1(String argument) {
        //HERE YOU GET DATA FROM YOUR FRAGMENT
    }

    @Override
    public void onAction2(String argument) {
        //HERE YOU GET DATA FROM YOUR FRAGMENT
    }
}

答案 3 :(得分:0)

感谢大家在这里我偶然发现了这个问题,尽管我可能犯了一些错误,但我想我会发布我所得到的内容,以防它可能对别人有所帮助

在MainActivity.java中:

if (findViewById(R.id.fragment_container) != null) {
    if (savedInstanceState == null) {
        frag = ContentFragment.getInstance(request);
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, frag).commit();
    }
}

在ContentFragment.java中:

private PostRequest request;
private static ContentFragment myFragment = null;

public static ContentFragment getInstance(PostRequest request){
    if( myFragment == null ){
        myFragment = new ContentFragment();
        myFragment.request = request;
    }
    return myFragment;
}

我只使用Android / Java工作了大约10天,而且对我来说需要花费很多时间。无论如何,感谢您的帮助!