为什么我的变量设置为空?

kiz8lqtg  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(351)

在解释之前,我将向您展示我的(简称)代码:

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,如何修复它?
但这帮不了我。
我看到很多用户无缘无故投了减分票。所以我希望这个问题是可以接受的。

cdmah0mi

cdmah0mi1#

这个 roomonCreateView() 被称为;这应该在打电话之后发生 ft.commit() 在你的 onTabSelected 方法。
但是 commit 是异步的,因此:
调用commit()后,不会立即应用fragmenttransaction
主线程不会等待,它只会继续执行下一行代码 commit() 是否完成(或甚至没有开始)。
因此, onCreateView()SecondFragment 在主线程调用之前未执行: room 在您尝试调用时仍未初始化 setText() 在上面。
为了避免这种情况,通过调用 executePendingTransactions :

//....
ft.replace(R.id.simpleFrameLayout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
ft.executePendingTransactions();

文档中的一些信息:
executependingtransactions——在使用fragmenttransaction#commit提交fragmenttransaction之后,它被安排在进程的主线程上异步执行。如果要立即执行任何挂起的操作,可以调用此函数。
在简历中 executePendingTransactions 提供 commit 有点像“同步”的性质。它将强制进程立即执行上计划的所有任务 FragmentTransaction .
这样,你就可以保证 onCreateView() 已正确执行(以及 room 初始化)在您呼叫时 s.roomText() ,避开 NullPointerException 这让你很困惑。

相关问题