填充EditText时出现空指针异常

问题描述 投票:0回答:3

我正在尝试使用从其他应用程序收到的文本填充我的

EditText
中的
Fragment

EditText 拥有一个值,但我不确定为什么我会得到一个

NullPointerException

这是我的片段类:

public class AddTab extends Fragment implements View.OnClickListener {

    View view;
    Button mButton;
    EditText textBox;
    String url;
    private OnFragmentInteractionListener mListener;

    public AddTab() {
        // 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 = inflater.inflate(R.layout.fragment_add, container, false);
        mButton = (Button)view.findViewById(R.id.button);
        textBox = (EditText) view.findViewById(R.id.editText);
        mButton.setOnClickListener(
                new View.OnClickListener() {
                    public void onClick(View view) {
                     //some code                      
                    }
                });
        return view;
    }
...
// some other methods

    public void receiveURL(String url) {
        textBox.setText(url);
       //this is where I'm getting the exception. Does EditText hold the value it has got in onCreateView()??
    }
}

如何在此处正确更新片段的 UI。即用传递给 receiveURL 方法的值填充我的 EditText?

编辑

堆栈跟踪:

03-24 13:30:56.986    7424-7424/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.nikhil.amazon1, PID: 7424
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.nikhil.amazon1/com.example.nikhil.amazon1.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
            at com.example.nikhil.amazon1.AddTab.receiveURL(AddTab.java:122)
            at com.example.nikhil.amazon1.MainActivity.handleSendText(MainActivity.java:102)
            at com.example.nikhil.amazon1.MainActivity.onCreate(MainActivity.java:82)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

MainActivity 类:从这个类中我调用 receiveURL() 方法。

public class MainActivity extends FragmentActivity implements ListTab.OnFragmentInteractionListener, AddTab.OnFragmentInteractionListener{
PendingIntent pendingIntent;
MyPagerAdapter objAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    objAdapter = new MyPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(objAdapter);
    // Bind the tabs to the ViewPager
    PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    pager.setCurrentItem(1);
    tabs.setShouldExpand(true);
    tabs.setViewPager(pager);
    //code for listening to intent from browser or other apps
    // Get intent, action and MIME type
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();
    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        }
    }
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        Fragment f = objAdapter.getItem(1);
        AddTab t = (AddTab) f;
        t.receiveURL(sharedText); 
      //from here I'm calling
    }
 }
}

我正在使用

pagerslidingtabstrip
创建选项卡。我获得了适配器的参考并获得了我的片段的实例
AddTab
。然后调用我的方法
receiveURL().

仅当用户共享来自其他应用程序的 URL(文本)时,所有这一切才会发生。

java android android-fragments
3个回答
0
投票

在设置文本之前,请尝试使用以下代码再次初始化您的编辑文本:

 textBox = (EditText) getView().findViewById(R.id.editText);

还请分享如果不起作用,您如何调用 receiveURL 方法。


0
投票

尝试使用本地广播

BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String g=i.getStringExtra("key")
             textBox.setText(g);

        }
    };

在 AddTab 的 onCreateView 中注册接收器..

getActivity().registerReceiver(receiver, new IntentFilter("refresh"));

从需要更新文本视图的地方调用广播

Intent refreshIntent = new Intent("refresh");
                refreshIntent.putExtra("key", "valueto be passed");
            getActivity().sendBroadcast(refreshIntent);

不要忘记在 onDestroyView 中取消注册广播

@Override
    public void onDestroyView() {
        // TODO Auto-generated method stub
        super.onDestroyView();
        getActivity().unregisterReceiver(receiver);
        ButterKnife.reset(this);
    }

0
投票

在片段中创建一个全局变量,例如

String receivedUrl;

在您的 receiveURL 方法中进行如下更改:

        public void receiveURL(String url)
{
    receivedUrl = url;
}

在 onCreateView 中进行以下更改

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_add, container, false);

    mButton = (Button)view.findViewById(R.id.button);
    textBox = (EditText) view.findViewById(R.id.editText);
    textBox.setText(receivedUrl);

    mButton.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick(View view)
                {
                 //some code                      
                }
            });

    return view;
}

希望这有效。

编辑:

进行以下更改。在 MainActivity 的 onCreate 中。

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


    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            url = handleSendText(intent); // Handle text being sent
        }
    }

    ViewPager pager = (ViewPager) findViewById(R.id.pager);
    objAdapter = new MyPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(objAdapter);

    // Bind the tabs to the ViewPager
    PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);

    pager.setCurrentItem(1);

    tabs.setShouldExpand(true);

    tabs.setViewPager(pager);

    //code for listening to intent from browser or other apps

    // Get intent, action and MIME type

}

String handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        return sharedText;
    }
    return null;
}

在 MyPagerAdapter 中

getItem(int arg0) {
    Fragment f = null;
    AddTab tab = new AddTab();
    tab.requireUrl(url);
    f = tab;
    return f;
}
© www.soinside.com 2019 - 2024. All rights reserved.