15

Tôi đã tạo một lớp để truy xuất các nhận xét từ một mã hóa JSON từ một tệp PHP. Lớp này, kéo dài từ AsyncTask:Lấy bối cảnh từ một đoạn

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(????); 
     pDialog.setMessage("Creating Product.."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

} 

Như bạn có thể thấy, tôi đang cố gắng hiển thị ProgressDialog trong khi quá trình "doInBackground" đang hoạt động. Nhưng constructor progressDialog, yêu cầu một Context, và tôi không biết cách cung cấp nó.

tôi gọi lớp này từ một Fragment, vì vậy tôi không thể truy cập vào bối cảnh như thế này:

pDialog = new ProgressDialog(MyFragmentA.context); 

Các "chính" acitivity được gọi là: AndroidViewPagerActivity kéo dài FragmentActivity.

(. Bởi chính, tôi muốn nói rằng đó là một trong đó là việc tạo ra các tab, và quản lý điều hướng giữa chúng)

này là nó là mã:

public class AndroidViewPagerActivity extends FragmentActivity { 
ViewPager mViewPager; 
TabsAdapter mTabsAdapter; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mViewPager = new ViewPager(this); 
    mViewPager.setId(R.id.pager); 
    setContentView(mViewPager); 

    final ActionBar bar = getActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME); 
    bar.hide(); 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 
    mTabsAdapter.addTab(bar.newTab().setText("Fragment A"), MyFragmentA.class, null); 

    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 

} 

Làm thế nào tôi có thể truy cập vào bối cảnh ? Tôi nên sử dụng ngữ cảnh nào? Ngữ cảnh "AndroidViewPagerActivity"? Vậy làm thế nào tôi có thể truy cập ngữ cảnh của nó từ một đoạn?

Cảm ơn bạn.

Sergi

Trả lời

43

Sử dụng getActivity() bên trong Fragment để có được một Context mà bạn có thể vượt qua cùng. Điều đó hoạt động, như Activity được kế thừa từ Context.

Thay thế, bạn có thể sử dụng getApplicationContext() để nhận được Context.

+0

Ok, điều này đã giải quyết được vấn đề. Với sự giúp đỡ của bạn và một số googleing thêm, tôi đã nhận nó: D. Đi để đặt mã cuối cùng của tôi, vì vậy every1 có thể thấy câu trả lời được thực hiện. – Reinherd

+2

Gọi getActivity() bên trong đoạn có thể dẫn đến NullPointerException khi được sử dụng ở quy mô lớn cho một số thiết bị. Điều này xảy ra khi cuộc gọi được thực hiện trước khi đoạn được gắn vào hoạt động. Nó cũng dẫn đến rò rỉ bộ nhớ có thể gây tử vong và khó tìm. Đi qua điều này để hiểu rõ hơn. https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html –

0

FragmentHoạt động này sẽ cung cấp cho bạn bối cảnh hoạt động và sau đó bạn có thể chuyển nó đến AsyncTask của bạn.

1

Được rồi, bây giờ tôi biết những điều mới mẻ:

  • Bạn đã để có được bối cảnh từ lớp mà instanced đoạn.

Bạn làm điều này bằng cách đưa mã này vào mã của bạn trong đoạn ("con").

Context cont; 
cont=getActivity(); 

Vì vậy, khi bạn đã hoàn thành, bạn sẽ vượt qua nó. Trong trường hợp của tôi, tôi đã phải vượt qua nó một lớp AsyncTask, vì vậy tôi có thể hiển thị một hộp thoại.

new RecuperarComentarisFoto(cont).execute(); 

Và để kết thúc việc này, trên lớp "RecuperarComentarisFoto", tôi đã tạo một hàm tạo. Như tôi đã đọc, nó là ok để làm điều đó theo cách này.

private Context mContext; 
public RecuperarComentarisFoto(Context context){ 
    this.mContext=context; 
} 

Và sự kỳ diệu:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    ProgressDialog pDialog = new ProgressDialog(this.mContext); 
    pDialog.setMessage("Creating Product.."); 
    pDialog.setIndeterminate(false); 
    pDialog.setCancelable(true); 
    pDialog.show(); 
} 

này tất cả kết thúc với: enter image description here

Các vấn đề liên quan