[英]Sending and Receiving data from Activity to another activity that extends fragment
我在從擴展 AppCompatActivity 的 Activity 發送數據並在擴展片段類的 Activity 中接收數據時遇到問題。 問題是我無法在接收類中擴展 AppCompatActivity ,因為我正在使用一個包含動畫圖表的 Java 庫,並且需要該片段類的擴展,以便活動識別某些方法......我使用了調試器並且似乎數據已成功添加到包中,但是,包在接收端返回 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;
}
SAMPLERADAPTER 代碼(使用 getitem 方法):
public class SamplerAdapter extends FragmentStatePagerAdapter {
private final int mCount = 10;
private Bundle extras;
Fragment fragment = new Fragment();
public SamplerAdapter(FragmentManager fm, Bundle extras) {
super(fm);
this.extras = extras;
}
@Override
public int getCount() {
return mCount;
}
@Override
public Fragment getItem(int position) {
fragment.setArguments(extras);
return fragment;
}
@Override
public void finishUpdate(ViewGroup container) {
super.finishUpdate(container);
}
}
任何人都可以附加我的代碼,以便它接收數據並將其顯示到我指定的文本框中。
任何幫助都會很棒,謝謝。
更改適配器構造函數以接收 Bundle Pass 構造函數內部的額外內容,例如
SamplerAdapter samplesAdapter = new SamplerAdapter(getSupportFragmentManager(), extras);
在 SamplerAdapter 類中為包創建一個全局變量
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;
}
首先,您不能在發送活動中創建您的片段。 您必須在將實例化所需片段的接收活動中創建它。
然后,要從發送活動到接收活動進行通信,您必須發送一個意圖。 把你的包放在這個意圖中。 在接收活動中,您可以調用 getIntent().getExtras() 來獲取您的 bundle 。 實例化你的片段並像你一樣給它捆綁。
另一件事,你的 while 循環是“奇怪的”。 如果您已經知道將得到一行結果,請不要創建循環並且不要使用 Stringbuilder。 如果您可以有多行,請不要在每個循環中重置 StringBuilder 的長度,因為它會在每個新行覆蓋以前的數據。
從 Activity 發送數據的目的是:
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);
}
有時您可以在您的活動中接收 Intent,您需要將信息傳遞給您的工作片段。 如果您需要啟動片段,給出的答案是可以的,但如果它仍在工作,則setArguments()
不是很有用。 如果傳遞的信息會導致與您的 UI 交互,則會出現另一個問題。 在這種情況下,你不能調用myfragment.passData()
類的東西,因為 android 會很快告訴只有創建視圖的線程才能與之交互。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.