片段中的Onclick,FATAL EXCEPTION。片段的共享首选项

时间:2016-09-16 20:03:51

标签: android android-fragments nullpointerexception sharedpreferences

基本信息

  

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

问题 我在context_main(启动应用程序时的第一个屏幕)中有textview但是我真的希望在我的片段中有textview,当我按下按钮时#34; 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

1 个答案:

答案 0 :(得分:1)

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

这意味着它无法以您访问它的方式在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,这是不必要的。

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

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

编辑:

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

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

... with:

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

这样您就可以在整个活动布局中查找R.id.raderanumtxt。这仅在活动可用且布局已添加时才有效,因此为了更加安全,我将此作业移至onViewCreated()而不是onCreateView()

相关问题