在解释之前,我将向您展示我的(简称)代码:
public class MainActivity extends AppCompatActivity
{
FrameLayout simpleFrameLayout;
TabLayout tabLayout;
SecondFragment s = new SecondFragment();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
simpleFrameLayout = (FrameLayout) findViewById(R.id.simpleFrameLayout);
tabLayout = (TabLayout) findViewById(R.id.simpleTabLayout);
// Create a new Tab named "First"
TabLayout.Tab firstTab = tabLayout.newTab();
firstTab.setText("First"); // set the Text for the first Tab
// first tab
tabLayout.addTab(firstTab); // add the tab at in the TabLayout
// Create a new Tab named "Second"
TabLayout.Tab secondTab = tabLayout.newTab();
secondTab.setText("Second"); // set the Text for the second Tab
tabLayout.addTab(secondTab); // add the tab in the TabLayout
Fragment fragment = null;
fragment = new FirstFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// get the current selected tab's position and replace the fragment accordingly
Fragment fragment = null;
switch (tab.getPosition()) {
case 0:
fragment = new FirstFragment();
myMenu.findItem(R.id.telefono).setVisible(false);
break;
case 1:
fragment = s;
myMenu.findItem(R.id.telefono).setVisible(true);
break;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public void conectar(String nombre, String ip, int puerto) {
//Code...
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
Looper.prepare();
runOnUiThread(new Runnable() {
@Override
public void run() {
try{
//Code...
try {
//Code
TabLayout.Tab tab = tabLayout.getTabAt(1);
tab.select();
s.roomText(param1);
}
catch(SocketTimeoutException ex)
{
}
}
catch(Exception e){
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
// create an email intent to send to yourself
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "lets.think.android@gmail.com" });
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "App Error Report");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, stacktrace);
// start the email activity - note you need to start it with a chooser
startActivity(Intent.createChooser(emailIntent, "Send error report..."));
}
}
});
}
});
}
}
第二个片段:
package com.mycompany.myapp;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
public class SecondFragment extends Fragment
{
EditText chat, room;
public SecondFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_second, container, false);
room = (EditText) view.findViewById(R.id.mainEditText1);
chat = (EditText) view.findViewById(R.id.chatEditText1);
return view;
}
public void roomText(String t){
room.setText(t);
}
}
我正在尝试设置mainactivity片段的edittext文本。为此,我在secondfragment中编写了一个方法,该方法应该更改edittext的文本。这个方法在mainactivity中调用。
为什么“房间”对象是空的,如果选项卡是事先选择的,而secondfragment的元素实际上应该已经创建了?我不明白。
我已经说过了:什么是nullpointerexception,如何修复它?
但这帮不了我。
我看到很多用户无缘无故投了减分票。所以我希望这个问题是可以接受的。
1条答案
按热度按时间cdmah0mi1#
这个
room
当onCreateView()
被称为;这应该在打电话之后发生ft.commit()
在你的onTabSelected
方法。但是
commit
是异步的,因此:调用commit()后,不会立即应用fragmenttransaction
主线程不会等待,它只会继续执行下一行代码
commit()
是否完成(或甚至没有开始)。因此,
onCreateView()
从SecondFragment
在主线程调用之前未执行:room
在您尝试调用时仍未初始化setText()
在上面。为了避免这种情况,通过调用
executePendingTransactions
:文档中的一些信息:
executependingtransactions——在使用fragmenttransaction#commit提交fragmenttransaction之后,它被安排在进程的主线程上异步执行。如果要立即执行任何挂起的操作,可以调用此函数。
在简历中
executePendingTransactions
提供commit
有点像“同步”的性质。它将强制进程立即执行上计划的所有任务FragmentTransaction
.这样,你就可以保证
onCreateView()
已正确执行(以及room
初始化)在您呼叫时s.roomText()
,避开NullPointerException
这让你很困惑。