关键词:
【中文标题】导航抽屉异步任务【英文标题】:Navigation Drawer AsyncTask 【发布时间】:2015-11-06 03:04:35 【问题描述】:我想公开我的问题,我想知道如何解决它。 在我的应用程序中,我正在使用一个活动,进行简单的登录,启动一个 asyncTask。在这个任务结束时,用户被重定向到另一个活动,这是应用程序的主活动。后者的任务是管理导航抽屉及其片段。每个片段的内容必须使用从服务器检索的数据填充,并且导航抽屉设置默认片段 F1,在用户登录后显示。 现在的问题是:
如何恢复填充 fragment1 中包含的 listView 所需的数据?
我知道如何为 listView 实现适配器,但我不明白如何将 home Activity 与 Fragment F1 进行通信。我的意图是检索一个循环对话框(F1 中的内容)并在适配器所需的数据尚未恢复时运行它。
这里有一些代码:
public class LoginActivity extends ActionBarActivity
private Button loginButton;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
loginButton = (Button) findViewById(R.id.login_button);
loginButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
new Login().execute();
;
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if (id == R.id.action_settings)
return true;
return super.onOptionsItemSelected(item);
private class Login extends AsyncTask<Void, Void, Void>
@Override
protected void onPreExecute()
super.onPreExecute();
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setMessage("Login");
progressDialog.setCancelable(false);
progressDialog.show();
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
if (progessDialog.isShowing())
progressDialog.dismiss();
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
Bundle bundle = new Bundle();
intent.putExtras(bundle);
startActivity(intent);
@Override
protected Void doInBackground(String... params)
// code to retrieve data.
public class HomeActivity extends ActionBarActivity implements FragmentDrawer.FragmentDrawerListener
private Toolbar toolbar;
private FragmentDrawer fragmentDrawer;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(false);
fragmentDrawer = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
fragmentDrawer.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
fragmentDrawer.setDrawerListener(this);
// Here the problem!!!
displayView(0);
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.menu_home, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if (id == R.id.action_settings)
return true;
return super.onOptionsItemSelected(item);
private void displayView(int position)
switch (position)
case 0:
Fragment fragmentOne = new FragmentOne();
move(matchFragment);
break;
case 1:
Fragment fragmentTwo = new FragmentTwo();
move(teamFragment);
break;
case 2:
Fragment fragmentThree = new FragmentThree();
move(myTeamFragment);
break;
case 3:
//other fragment....
default:
break;
public void move (Fragment fragment)
if (fragment != null)
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment, fragment.getClass().getSimpleName());
fragmentTransaction.commit();
@Override
public void onDrawerItemSelected(View view, int position)
displayView(position);
public class FragmentOne extends Fragment
private ListView listView;
private ArrayList<Info> infos;
private InfoAdapter infoAdapter;
public FragmentOne()
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState)
final View rootView = inflater.inflate(R.layout.fragment_match, container, false);
listView = (ListView) rootView.findViewById(R.id.match_list_view);
return rootView;
现在,我在哪里实现 AsyncTask 来检索适配器的数据?在片段或活动中? 如果是Activity,如何恢复fragment的view元素?
在此先感谢,抱歉英语不好。
【问题讨论】:
【参考方案1】:第一个问题:
我不明白如何将家庭活动与 片段F1
您可以通过传递给 Fragment 构造函数的参数将信息从 HomeActivity 传递给 Fragment。因此,您可以调用Fragment fragmentOne = new FragmentOne(A a);
而不是Fragment fragmentOne = new FragmentOne();
,其中a 是您要传递给片段的数据。当然,你需要在Fragment类中加入带参数的构造函数。
第二点:
现在,我在哪里实现 AsyncTask 来检索适配器的数据? 在片段或活动中?如果是Activity,我该怎么做 恢复fragment的view元素?
您可以在 onCreate() 中调用 AsynchTask 来为 listView...等加载数据。我更喜欢的另一个选择是使用加载器。请在此处http://developer.android.com/guide/components/loaders.html 查看有关加载程序的文档。它也有一个例子。
对于解释和示例,您可以按照以下 4 部分教程进行操作: http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html.
【讨论】:
fragment的构造函数不能为空? @Rick91,我不是那个意思。我的意思是,如果您想将信息从 Activity 传递到 fragment ,一种方法是创建带有一些参数的非默认构造函数。您可以同时使用空构造函数(无论出于何种原因)。 我可以使用这样的东西:public static MyFragment newInstance(int someInt) MyFragment myFragment = new MyFragment(); Bundle args = new Bundle(); args.putInt("someInt", someInt); myFragment.setArguments(args); return myFragment;
能不能给我一个关于装载机的例子?
我不明白的是:在LoginActivity的AsyncTask完成后,你看到fragmentOne,我必须在哪里调用获取listView所需数据的方法?
这正是装载机将要处理的事情。您不再需要调用 AsyncTask。如果你实现了 LoaderManager.LoaderCallbacks 接口,你应该在 onCreateLoader() 方法中创建一个新的加载器来检索数据(从内容提供者、数据库或通过网络,...),并在 onLoadFinished() 方法中将数据填充到你的视图中。如果要异步加载数据,则查找 AsyncTaskLoader。我已经用教程的链接更新了我的答案。希望对您有所帮助。带有自定义按钮的导航抽屉
】带有自定义按钮的导航抽屉【英文标题】:NavigationDrawerwithCustomButton【发布时间】:2020-01-1818:56:11【问题描述】:我目前正在尝试为我的应用设置一个搜索栏,如下图所示。目前我有一个可以很好地用作搜索栏的小部件,但我... 查看详情
异步任务后在 SwiftUI 中的正确导航方式
】异步任务后在SwiftUI中的正确导航方式【英文标题】:ProperwayofNavigationinSwiftUIafterasynctask【发布时间】:2021-01-0913:26:55【问题描述】:我有一个带有List视图的屏幕,其中一个是NavigationLink,它导航到显示PDF文档的单独屏幕DocumentP... 查看详情
Fragment 如何从使用 http 和异步任务获取数据的 MainActivity 类中获取数据?
...:我正在使用AndroidStudio创建一个Android应用。我正在使用导航抽屉模板。我想在主页片段中使用h 查看详情
多个活动的导航抽屉,无需选择导航抽屉活动
】多个活动的导航抽屉,无需选择导航抽屉活动【英文标题】:NavigationDrawerFormultipleActivitiesWithoutSelectingNavigationDraweractivity【发布时间】:2020-06-0201:14:37【问题描述】:我是安卓新手。我想实现一个由项目列表组成的导航抽屉,... 查看详情
在导航抽屉项目单击时,导航抽屉中的新列表视图
】在导航抽屉项目单击时,导航抽屉中的新列表视图【英文标题】:Onnavigationdraweritemclick,newlistviewinnavigationdrawer【发布时间】:2015-09-1505:38:42【问题描述】:我试图在导航抽屉中获得以下功能,但我无法打破它。场景:-我有一... 查看详情
导航抽屉不适用于导航组件
】导航抽屉不适用于导航组件【英文标题】:NavigationDrawerdon\'tworkwithnavigationComponent【发布时间】:2019-08-2204:21:03【问题描述】:当用户点击菜单项时,导航抽屉不会让用户到达目的地。导航抽屉显示正确,但不起作用。有什么... 查看详情
导航抽屉 - 禁用点击抽屉后面的项目
】导航抽屉-禁用点击抽屉后面的项目【英文标题】:Navigationdrawer-Disableclickthroughonitemsbehindthedrawer【发布时间】:2013-07-0402:57:26【问题描述】:有什么方法可以确保导航抽屉位于片段内容的顶部?我用虚拟数据创建了一个小型测... 查看详情
导航架构组件 - 导航抽屉
】导航架构组件-导航抽屉【英文标题】:NavigationArchitectureComponent-NavigationDrawer【发布时间】:2018-12-2212:24:36【问题描述】:我正在使用带有导航抽屉的导航组件。我为菜单中的每个导航项添加了片段。在此Fragment将被交换的位置... 查看详情
从片段中禁用导航抽屉
】从片段中禁用导航抽屉【英文标题】:Disablingnavigationdrawerfromfragment【发布时间】:2016-07-1422:59:39【问题描述】:我有一个带有导航抽屉和4个导航项(片段)的应用。在其中一个片段中,我设置了一个带有视图寻呼机的选项卡... 查看详情
如何删除导航抽屉?
】如何删除导航抽屉?【英文标题】:Howtoremovenavigationdrawer?【发布时间】:2021-05-1202:56:48【问题描述】:我想从我的fragment_login和fragment_create_account片段中删除导航抽屉。我使用addOnDestinationChangedListener从这些片段中删除了底部导... 查看详情
返回默认 OnClickListener 导航抽屉图标
】返回默认OnClickListener导航抽屉图标【英文标题】:ReturntodefaultOnClickListenerNavigationDrawerIcon【发布时间】:2016-10-2405:31:26【问题描述】:我想更改工具栏上导航抽屉图标的OnClickListener。之后,我想返回导航抽屉图标的默认行为和O... 查看详情
在导航抽屉关闭之前加载片段
】在导航抽屉关闭之前加载片段【英文标题】:LoadFragmentbeforeNavigationDrawercloses【发布时间】:2013-08-3114:19:37【问题描述】:我已经实现了一个导航抽屉,我想在导航抽屉关闭之前加载我的片段。目前,fragment与抽屉关闭并行加载... 查看详情
导航抽屉如何覆盖操作栏?
】导航抽屉如何覆盖操作栏?【英文标题】:howdoesnavigationdrawercoveractionbar?【发布时间】:2014-10-3106:45:37【问题描述】:我想在出现导航抽屉时覆盖操作栏。但我只知道在出现导航抽屉时保持操作栏。(我知道这是谷歌的标准形... 查看详情
Python透明KivyMD导航抽屉
】Python透明KivyMD导航抽屉【英文标题】:PythonTransparentKivyMDNavigationDrawer【发布时间】:2020-11-2115:09:12【问题描述】:我正在尝试对我的应用(数字规划器)应用一些更改,其中之一是能够在MDNavigationDrawer中切换屏幕,但我有两个... 查看详情
如何从导航抽屉启动活动?
】如何从导航抽屉启动活动?【英文标题】:HowtolaunchactivityfromNavigationDrawer?【发布时间】:2014-06-3020:25:10【问题描述】:所以我在这里搜索了有关导航抽屉的分配,当我被指向另一个人问题的答案中的教程时。我这样做了。我... 查看详情
如何同时使用导航抽屉和底部导航 - 导航架构组件
】如何同时使用导航抽屉和底部导航-导航架构组件【英文标题】:HowtouseNavigationDrawerandBottomNavigationsimultaneously-NavigationArchitectureComponent【发布时间】:2019-09-2305:46:30【问题描述】:我的屏幕如下所示,在同一屏幕上包含导航抽屉... 查看详情
使用继承的活动导航抽屉实现
】使用继承的活动导航抽屉实现【英文标题】:Navigationdrawerimplementationwithactivitiesusinginheritance【发布时间】:2016-05-2015:35:15【问题描述】:在我的应用程序中,我必须对所有活动使用导航抽屉。所以我创建了一个名为DrawerActivity... 查看详情
如何实现导航抽屉布局?
】如何实现导航抽屉布局?【英文标题】:HowtoimplementaNavigationDrawerlayout?【发布时间】:2020-07-1103:46:31【问题描述】:我想实现一个导航抽屉布局,我想使用一个切换栏来打开或关闭导航抽屉。你能把主要活动java和xml文件的代码... 查看详情