我正在学习如何使用片段,在我的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);
}
答案 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天,而且对我来说需要花费很多时间。无论如何,感谢您的帮助!