Java 从活动向扩展片段的另一个活动发送和接收数据

Java 从活动向扩展片段的另一个活动发送和接收数据,java,android,android-fragments,Java,Android,Android Fragments,我在从扩展AppCompatActivity的活动发送数据并在扩展fragment类的活动中接收数据时遇到问题。问题是,我无法在接收类中扩展AppCompatActivity,因为我正在使用一个包含动画图表的java库,需要对该片段类进行扩展,以便activity识别某些方法。。。。我使用了debugger,看起来数据被成功地添加到bundle中,但是,bundle在接收端返回null。(代码如下) 发送活动: public class CreateLine extends AppCompatA

我在从扩展AppCompatActivity的活动发送数据并在扩展fragment类的活动中接收数据时遇到问题。问题是,我无法在接收类中扩展AppCompatActivity,因为我正在使用一个包含动画图表的java库,需要对该片段类进行扩展,以便activity识别某些方法。。。。我使用了debugger,看起来数据被成功地添加到bundle中,但是,bundle在接收端返回null。(代码如下)

发送活动:

public class CreateLine extends AppCompatActivity {

    DatabaseHelper myDb;
    Button dateButton, nextButton;
    TextView quantity, duration;
    Date date = new Date();
    String PackageType20 = "648 Shippers";
    String PackageType30 = "605 Shippers";
    int timeadded;
    private Spinner spinner, spinner2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_line);
        myDb = new DatabaseHelper(this);

        quantity = (TextView) findViewById(R.id.editText3);
        duration = (TextView) findViewById(R.id.durationtextView);
        dateButton = (Button) findViewById(R.id.angry_btn);
        nextButton = (Button) findViewById(R.id.Confirm_button);

        spinner = (Spinner) findViewById(R.id.spinner);

        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(com.almac.tracker.CreateLine.this,
                R.layout.spinner_layout, getResources().getStringArray(R.array.LineTypes));
        myAdapter.setDropDownViewResource(R.layout.spinner_layout);
        spinner.setAdapter(myAdapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position2, long l) {


                switch ((int) position2) {
                    case 0:
                        quantity.setText("");
                        ;
                        break;
                    case 1:
                        quantity.setVisibility(View.INVISIBLE);
                        timeadded = 10;
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.INVISIBLE);
                        break;
                    case 2:
                        quantity.setVisibility(View.INVISIBLE);
                        timeadded = 10;
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.INVISIBLE);
                        break;
                    case 3:
                        quantity.setVisibility(View.INVISIBLE);
                        timeadded = 10;
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.INVISIBLE);
                        break;
                    case 4:
                        quantity.setVisibility(View.VISIBLE);
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.VISIBLE);
                        Toast.makeText(getApplicationContext(), "Select Package Type", Toast.LENGTH_SHORT).show();
                        break;
                    case 5:
                        quantity.setVisibility(View.VISIBLE);
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.VISIBLE);
                        break;
                    case 6:
                        quantity.setVisibility(View.VISIBLE);
                        duration.setText(timeadded + " Hours");
                        spinner2.setVisibility(View.VISIBLE);
                        break;
                    default:
                        break;

                }
            }


            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

        spinner2 = (Spinner) findViewById(R.id.spinner2);

        ArrayAdapter<String> myAdapter2 = new ArrayAdapter<String>(com.almac.tracker.CreateLine.this,
                R.layout.spinner_layout, getResources().getStringArray(R.array.PackageTypes));
        myAdapter2.setDropDownViewResource(R.layout.spinner_layout);
        spinner2.setAdapter(myAdapter2);

        spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {


                switch (position) {
                    case 0:
                        quantity.setText("");
                        ;
                        break;
                    case 1:
                        quantity.setText(PackageType20);
                        timeadded = 28;
                        duration.setText(timeadded + " Hours");


                        break;
                    case 2:
                        quantity.setText(PackageType30);
                        timeadded = 27;
                        duration.setText(timeadded + " Hours");

                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });


        dateButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                dateButton.setText(date.toString());

                // Creates an instance of current DateTime which represents the
                // current date time.
                DateTime dateTime = new DateTime();
                DateTimeFormatter fmt = DateTimeFormat.forPattern("E d MMM yyyy" + "\n" + " h:mm a ");
                String formattedtime = fmt.print(dateTime);
                dateButton.setText(formattedtime);

                // Plus some hours, minutes, and seconds to the original DateTime.
                DateTimeFormatter fmt2 = DateTimeFormat.forPattern("E d MMM yyyy" + "\n" + " h:mm a ");

                DateTime dateTime1 = dateTime.plusHours(timeadded);
                String endtimecalc = fmt2.print(dateTime1);
                TextView endtime = findViewById(endtimetextView);
                endtime.setText(endtimecalc);

                String spinnerSelection = String.valueOf(spinner.getSelectedItem());
                String spinnerSelection2 = String.valueOf(spinner2.getSelectedItem());
                String q = quantity.getText().toString();
                String d = duration.getText().toString();

                //INSERT DATA TO DATABASE
                boolean isInserted = myDb.insertData(
                        spinnerSelection,
                        spinnerSelection2,
                        q,
                        d,
                        formattedtime,
                        endtimecalc);

                if (isInserted == true)
                    Toast.makeText(CreateLine.this, "Data Inserted Successfully", Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(CreateLine.this, "Data not Inserted", Toast.LENGTH_LONG).show();

            }
        });


        nextButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                    Cursor res = myDb.getAllData();

                    StringBuffer buffer0 = new StringBuffer();
                    StringBuffer buffer1 = new StringBuffer();
                    StringBuffer buffer2 = new StringBuffer();
                    StringBuffer buffer3 = new StringBuffer();
                    StringBuffer buffer4 = new StringBuffer();
                    StringBuffer buffer5 = new StringBuffer();
                    StringBuffer buffer6 = new StringBuffer();


                    if ( res != null && res.moveToFirst()) {
                        do {

                            buffer0.setLength(0);
                            buffer1.setLength(0);
                            buffer2.setLength(0);
                            buffer3.setLength(0);
                            buffer4.setLength(0);
                            buffer5.setLength(0);
                            buffer6.setLength(0);

                            String getid = res.getString(0);
                            String getlt = res.getString(1);
                            String getpt = res.getString(2);
                            String getqty = res.getString(3);
                            String getdur = res.getString(4);
                            String getst = res.getString(5);
                            String getet = res.getString(6);

                            buffer0.append(getid);
                            buffer1.append(getlt);
                            buffer2.append(getpt);
                            buffer3.append(getqty);
                            buffer4.append(getdur);
                            buffer5.append(getst);
                            buffer6.append(getet);
                        } while (res.moveToNext());
                    }


                Fragment fragment = new Fragment();
                Bundle extras = new Bundle();

                extras.putString("ID", buffer0.toString());
                extras.putString("LineType", buffer1.toString());
                extras.putString("PackageType", buffer2.toString());
                extras.putString("Quantity", buffer3.toString());
                extras.putString("Duration", buffer4.toString());
                extras.putString("Starttime",buffer5.toString());
                extras.putString("endtime", buffer6.toString());
                fragment.setArguments(extras);



                setContentView(R.layout.line_details);
                SamplerAdapter samplesAdapter = new SamplerAdapter(getSupportFragmentManager());
                ViewPager samplesPager = (ViewPager) findViewById(R.id.samplesPager);
                samplesPager.setAdapter(samplesAdapter);


            }
        });
    }
 }
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View myInflatedView = inflater.inflate(R.layout.line_details, container, false);

    Bundle extras = this.getArguments();
    if (extras != null) {

        String id = extras.getString("ID");
        String linetype = extras.getString("LineType");
        String packagetype = extras.getString("PackageType");
        String Quantity = extras.getString("Quantity");
        String Duration = extras.getString("Duration");
        String Starttime = extras.getString("Starttime");
        String endtime = extras.getString("endtime");

        TextView LT = (TextView) getView().findViewById(R.id.textViewLT);
        TextView PT = (TextView) getView().findViewById(R.id.textViewPT);
        TextView QTY = (TextView) getView().findViewById(R.id.textViewQTY);
        TextView DUR = (TextView) getView().findViewById(R.id.textViewDUR);
        TextView ST = (TextView) getView().findViewById(R.id.textViewST);
        TextView ET = (TextView) getView().findViewById(R.id.textViewET);

        LT.setText(linetype);
        PT.setText(packagetype);
        QTY.setText(Quantity);
        DUR.setText(Duration);
        ST.setText(Starttime);
        ET.setText(endtime);
    }

    return myInflatedView;
}
采样器适配器代码(使用getitem方法):

}

任何人都可以附加我的代码,以便它接收数据并将其显示到我指定的文本框中


任何帮助都会很好,谢谢。

首先,您不能在发送活动中创建片段。您必须在将实例化所需片段的接收活动中创建它

然后,要从发送活动到接收活动进行通信,您必须发送意图。 把你的包裹放在这里面。 在接收活动中,您可以调用getIntent().getExtras()来获取捆绑包。 实例化您的片段,并像您所做的那样将其打包


另一件事,你的while循环是“奇怪的”。如果您已经知道将得到一行结果,请不要创建循环,也不要使用Stringbuilder。如果可以有多行,请不要在每个循环中重置StringBuilder的长度,因为它将在每一新行覆盖以前的数据。

更改适配器构造函数以接收捆绑包 把多余的东西传给施工人员

SamplerAdapter samplesAdapter = new SamplerAdapter(getSupportFragmentManager(), extras);
在SampleAdapter类中,为bundle创建一个全局变量

private Bundle extras;

public SamplerAdapter(FragmentManager fm, Bundle extras){
   super(fm);
   this.extras = extras;
}

// Now set these arguments in getItem method
    @Override
    public Fragment getItem(int position) {
        // Create your fragment set arguments in that fragment
        Fragment fragment = new LineDetails();
        fragment.setArguments(bundle);
        return fragment;
    }

从“活动”发送数据,目的是:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
在Fragment onCreateView方法中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

有时,您可以在活动中接收到意图,您需要将信息传递给您的工作片段。如果您需要启动片段,那么给出的答案是可以的,但是如果片段仍在工作,
setArguments()
不是很有用。如果传递的信息会导致与UI交互,则会出现另一个问题。在这种情况下,您不能调用类似于
myfragment.passData()
的函数,因为android会很快告诉您,只有创建视图的线程才能与之交互。

显示发送活动的完整代码:如果一个类扩展了fragment,那么它就不是活动。好的,我会在上面编辑您的接收活动是fragment?我想是的。。。“公共类LineDetails扩展SampleFragment{”SampleFragment是我需要引用的java类,用于识别动画图表工作的方法。我曾尝试使用intent发送数据,但我被告知这在片段中不起作用,是的,我尝试仅显示插入数据库的最后一行。开始时,它是displaying每一行,我被告知使用setbufferlength方法来显示最后一行,但是,它是红色的。实例化我的片段是什么意思?您能在getItem方法中显示一些接收代码吗?当我尝试编写fragment.setArguments时,它没有被识别?是否有地方我应该声明这个片段?我已经在上面添加了它。另外,在我的LineDetails类中,我需要什么代码要更改以使建议的答案生效,请为接收片段创建新实例,而不是fragment fragment=new fragment();那么应该是Fragment Fragment=new LineDetails吗?或者如何创建该实例如果SamplerAdapter代码现在没有错误..我是否需要编辑任何LineDetails代码以检索数据?在读取Fragment中的捆绑内容时,始终首先使用getArguments方法将捆绑接收到捆绑对象中,并对照n进行检查否则,当没有传递包时,getString方法将应用于null,因此NPE也将应用于null。这将避免在未传递包时出现null指针异常。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}