【问题标题】:Onclick in fragment, FATAL EXCEPTION. Shared preferences to a fragmentOnclick 在片段中,致命异常。片段的共享首选项
【发布时间】:2017-01-25 03:28:19
【问题描述】:

基本信息

我正在使用设置活动和导航菜单:并且我有按钮来显示从设置到文本视图的数据(即数字)。这是一个短信应用

问题 我在 context_main 中有 textview(启动应用程序时的第一个屏幕)但我真的很想在我的片段中有 textview,当我按下按钮时,“onlick”将显示设置中的值。

按钮在片段中。当我单击该按钮时,它对以下代码的 context_main se 起作用^^。

public void displayData(View view){

        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this);
    String restoredText = prefs.getString("example_text", "");
    radertst.setText(restoredText);
    }

但是当我按下一个按钮发送一条短信并将它与文本字段链接到数字所在的位置时,我得到了这个。

09-16 20:47:03.501 5389-5389/c.timno.smsgsm20 E/AndroidRuntime: FATAL EXCEPTION: main

Process: c.timno.smsgsm20, PID: 5389  
java.lang.NullPointerException                                                                   
at c.timno.smsgsm20.FirstFragment$1$override.onClick(FirstFragment.java:102)
at c.timno.smsgsm20.FirstFragment$1$override.access$dispatch(FirstFragment.java)
at c.timno.smsgsm20.FirstFragment$1.onClick(FirstFragment.java:0)
at android.view.View.performClick(View.java:4443)
at android.view.View$PerformClick.run(View.java:18475)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
at dalvik.system.NativeStart.main(Native Method)

这是我的 MainActivity java 类

public class MainActivity extends AppCompatActivity


        implements NavigationView.OnNavigationItemSelectedListener {
TextView tstnr;
    TextView radertst;
    EditText nantxt;
    Button sendSMSaon;
    EditText aonTxt;
    TextView nrladd;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);


        tstnr = (TextView) findViewById(R.id.nummertestsp);
        radertst = (TextView) findViewById(R.id.raderanumtxt);
        nantxt =(EditText) findViewById(R.id.nummer);
        sendSMSaon = (Button)findViewById(R.id.skickaaon);
        aonTxt = (EditText)findViewById(R.id.aon);
       nrladd = (TextView)findViewById(R.id.numretladd);


    }
//This is where the call for the value in the setttings are.
//Här är så att man kan lägga in values från inställningar till mainactivity.

    public void displayData(View view){

        SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this);
    String name = prefs.getString("example_text", "");
   radertst.setText(name + " ");
    }

//downbelow is where the onresume so the value boots up with the app.
//nedanför är för att appen ska ladda koden i settings direkt när man startar

   @Override
    protected void onResume() {
       super.onResume();
      SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this);

        String name = prefs.getString("example_text", "");
       radertst.setText(name + " ");}



    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Intent intent = new Intent(this, SettingsActivity.class);
            startActivity(intent);



            return true;
        }




        return super.onOptionsItemSelected(item);
    }


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        android.app.FragmentManager fragmentManager = getFragmentManager();


        if (id == R.id.nav_first_layout) {

            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame
                    , new FirstFragment())
                    .commit();
            // Handle the camera action
        } else if (id == R.id.nav_second_layout) {
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame
                            , new SecondFragment())
                    .commit();

        } else if (id == R.id.nav_third_layout) {
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame
                            , new ThirdFragment())
                    .commit();




        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;








}
}

片段java文件

public class FirstFragment extends Fragment {



    private View view ;

    public FirstFragment(){


    }
    Button sendSMS;
    Button sendSMSaon;
    Button sendSMSaoff;
    Button sendSMSrela1;
    Button sendSMSrela2;
    EditText msgTxt;
    EditText numTxt;
   EditText aonTxt;
    EditText aoffTxt;
    EditText rela1txt;
    EditText rela2txt;
    Button taframnummer;
    TextView nyanumtxt;

TextView ifirt;


    TextView tstnr;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_layout, container, false);



           nyanumtxt = (TextView)view.findViewById(R.id.raderanumtxt);
        sendSMS = (Button)view.findViewById(R.id.skicka);
       sendSMSaon = (Button)view.findViewById(R.id.skickaaon);
        sendSMSaoff = (Button)view.findViewById(R.id.skickaaoff);
        sendSMSrela1 = (Button)view.findViewById(R.id.skickarela1);
        sendSMSrela2 = (Button)view.findViewById(R.id.skickarela2);

        msgTxt = (EditText)view.findViewById(R.id.Textmeddelande);
        numTxt = (EditText)view.findViewById(R.id.nummer);
        aonTxt = (EditText)view.findViewById(R.id.aon);
        aoffTxt = (EditText)view.findViewById(R.id.aoff);
        rela1txt = (EditText)view.findViewById(R.id.rela1txt);
        rela2txt = (EditText)view.findViewById(R.id.relä2txt);
        taframnummer = (Button) view.findViewById(R.id.taframnummer);

        tstnr = (TextView) view.findViewById(R.id.numretladd);



        msgTxt.setVisibility(View.INVISIBLE);
        aonTxt.setVisibility(View.INVISIBLE);
        aoffTxt.setVisibility(View.INVISIBLE);
        rela1txt.setVisibility(View.INVISIBLE);
        rela2txt.setVisibility(View.INVISIBLE);

//testnedan

        LayoutInflater lf = getActivity().getLayoutInflater();
        view = lf.inflate(R.layout.first_layout, container, false);



//ovantest

        sendSMSaoff.setOnClickListener(new View.OnClickListener() {
                                           @Override
                                           public void onClick(View v) {
                                               String mymsgaoff = aoffTxt.getText().toString();
                                               String theNumber = numTxt.getText().toString();
                                               sendMsg(theNumber, mymsgaoff);
                                           }

                                       }

        );

        sendSMSaon.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                          public void onClick(View v) {
                                             String mymsgaon = aonTxt.getText().toString();
                                              String theNumber = nyanumtxt.getText().toString();
                                             sendMsg(theNumber, mymsgaon);
                                         }

                                     }







      );
        sendSMS.setOnClickListener(new View.OnClickListener() {
                                       @Override
                                       public void onClick(View v) {
                                           String myMsg = msgTxt.getText().toString();
                                           String theNumber = numTxt.getText().toString();
                                           sendMsg(theNumber, myMsg);
                                       }

                                   }
        );

        sendSMSrela1.setOnClickListener(new View.OnClickListener() {
                                            @Override
                                            public void onClick(View v) {
                                                String myMsgrela1 = rela1txt.getText().toString();
                                                String theNumber = numTxt.getText().toString();
                                                sendMsg(theNumber, myMsgrela1);
                                            }

                                        }
        );
        sendSMSrela2.setOnClickListener(new View.OnClickListener() {
                                            @Override
                                            public void onClick(View v) {
                                                String mymsgrela2 = rela2txt.getText().toString();
                                                String theNumber = numTxt.getText().toString();
                                                sendMsg(theNumber, mymsgrela2);
                                            }

                                        }







        );

        return view;
    }



    private void sendMsg(String theNumber, String myMsg)
    {
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(theNumber, null, myMsg, null, null);

    }


}

如果你看

sendSMSaoff.setOnClickListener(new View.OnClickListener() {
                                           @Override
                                           public void onClick(View v) {
                                               String mymsgaoff = aoffTxt.getText().toString();
                                               String theNumber = numTxt.getText().toString();
                                               sendMsg(theNumber, mymsgaoff);
                                           }

numTxt 是我希望加载值的位置,它位于第一个布局 xml 中,而不是 context_main。所以由于某种原因,它不会在那里加载。 Imgur image

【问题讨论】:

    标签: android android-fragments nullpointerexception sharedpreferences


    【解决方案1】:

    如果我的理解正确,R.id.raderanumtxt 位于 MainActivity 的布局文件中,而不是 FirstFragment 的。

    这意味着它不会像您访问它的方式那样在 FirstFragment 的 onCreateView() 方法中找到。 view 对象那里是你刚刚加载的布局:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_layout, container, false);
        nyanumtxt = (TextView)view.findViewById(R.id.raderanumtxt); // <- this assignment won't work
        ... 
    }
    

    你还膨胀了R.layout.first_layout 两次,这是不必要的。

    要访问 Activity 中的视图,您可以执行以下操作:

    View view = getActivity().findViewById(R.id.viewid);
    

    编辑:

    没有看到您的布局,我无法确定,但请尝试替换:

    nyanumtxt = (TextView)view.findViewById(R.id.raderanumtxt);
    

    ... 与:

    nyanumtxt = (TextView) getActivity().findViewById(R.id.raderanumtxt);
    

    这样你就在整个 Activity 布局中寻找R.id.raderanumtxt。这仅在 Activity 可用且布局已添加时才有效,因此为了更安全,我将此分配移动到 onViewCreated() 而不是 onCreateView()

    【讨论】:

    • 当您在视图上调用 findViewById() 时,您只会查看该特定视图的子视图。
    • 您好,感谢您的帮助!没错R.id.radernumtxt 在 MainActivity 的布局文件中,我如何将它访问到我的片段屏幕?所以我应该删除nyanumtxt = (TextView)view.findViewbyId(R.id.raderanumtxt 并添加这个代码View view = getActivity().findViewById(R.id.whatIdShouldIWriteHere); 但是我应该用numTxt 做什么?在短信部分`用主布局文件中的 raderanumtxt 替换它?我真的很感激你的帮助。
    • 也许视图加载速度很快?所以它变成了一个致命的异常,所以我应该把它放在 onViewCreated() 中。但是我在哪里做呢?
    • 非常感谢!我今天晚上19:00到03:50在电脑上哈哈。你解决了!我太感谢了!! :D
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-07-13
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多