因此,我仍然很擅长使用Android Studio及其中的所有内容。我一直试图让片段直接相互通信。在这里,我只是想在我的一个片段中设置TextView
文本元素。我已经看了好几个小时并尝试了很多,但我不知道该怎么做。另外,我正在通过FrameLayout
中的代码实现我的片段。
这是我正在尝试编辑其文本值的片段:
public class ReceivingFrag extends Fragment {
TextView sender;
public void updateText(String text) {
sender.setText(text);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_sender, container, false);
sender = (TextView) v.findViewById(R.id.sender);
return v;
}
}
我认为我的根本问题是getView()
和发件人都返回Null
。我也理解片段在技术上不是视图,而是有助于视图的布局和ViewGroups
。任何帮助表示赞赏。
不确定是否有帮助,但这是在updateText()
类中调用ReceivingFrag
方法的方法。
public void sendText(String text){
ReceivingFrag frag = new ReceivingFrag();
getSupportFragmentManager().beginTransaction().add(R.id.receiving_container, frag).commit();
getSupportFragmentManager().executePendingTransactions()
frag.updateText(text);
}
**编辑: 这是我调用和创建片段的MainActivity类:
public class MainActivity extends AppCompatActivity implements SendingFragment.TextClicked {
private static final String TAG = MainActivity.class.getSimpleName();
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] myStringArray = {"Hello", "Nice To See You", "Bye"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
ListView listView = (ListView) findViewById(R.id.mobile_list);
listView.setAdapter(adapter);
sendText("Hello");
}
@Override
public void sendText(String text){
ReceivingFrag frag = new ReceivingFrag();
getSupportFragmentManager().beginTransaction().add(R.id.receiving_container, frag).commit();
getSupportFragmentManager().executePendingTransactions();
frag.updateText(text);
}}
**编辑2: 这是MainActivity布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/apk/tools"
xmlns:tools2="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1">
<EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message"
android:layout_weight="1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="sendMessage"
android:text="@string/button_send"/>
</LinearLayout>
<ListView android:id="@+id/mobile_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/receiving_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></FrameLayout></LinearLayout>
这是片段的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/sender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/frag_sender"
android:background="@color/gray"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/></LinearLayout>
解决方案: 因此,如下所述,通过添加
来修复运行时错误 @Override
protected void onResume() {
super.onResume();
sendText("hello");
}
到MainActivity类。阅读https://developer.android.com/guide/components/fragments.html#Lifecycle后 我认为声明
“一旦活动达到恢复状态,您就可以自由地向活动添加和删除片段。因此,只有当活动处于恢复状态时,片段的生命周期才能独立发生变化。”
最能说明情况以及最初发生错误的原因。
答案 0 :(得分:0)
将您的片段更改为:
public class ReceivingFrag extends Fragment {
private TextView sender;
public void updateText(String text) {
sender.setText(text);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_sender, container, false);
sender = (TextView) v.findViewById(R.id.sender);
return v;
}
}
并且在您的活动中,在调用updateText
方法之前,请确保片段事务已执行:
public void sendText(String text){
ReceivingFrag frag = new ReceivingFrag();
getSupportFragmentManager().beginTransaction().add(R.id.receiving_container, frag).commit();
getSupportFragmentManager().executePendingTransactions();
frag.updateText(text);
}
答案 1 :(得分:0)
如果你改为将sendText()
放在onResume()
中,
@Override
protected void onResume() {
super.onResume();
sendText("Hello");
}
它不会给你Null Pointer Exception。当您从null
拨打该片段时,该片段仍为onCreate()
。