无法在Fragment中编辑TextView

时间:2016-12-31 23:28:15

标签: android android-fragments textview

因此,我仍然很擅长使用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后 我认为声明

“一旦活动达到恢复状态,您就可以自由地向活动添加和删除片段。因此,只有当活动处于恢复状态时,片段的生命周期才能独立发生变化。”

最能说明情况以及最初发生错误的原因。

2 个答案:

答案 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()