我在我的应用程序中使用导航抽屉(通过从屏幕左侧滑动打开的导航类型).现在,通常您也可以通过点击应用程序图标打开它,当我查找它时,我发现了一大堆代码要添加到您的活动中.只是为了一个简单的按钮.我想那不是我想要的东西吗?如果真的需要为单个按钮设置如此多的代码,那么使代码更清晰的最佳方法是什么?谢谢你,抱歉是这样一个Android新手.
我正在尝试从Android http://developer.android.com/design/patterns/navigation-drawer.html#ImpactOnNav导入使用新"导航抽屉"所需的类
DrawerLayout:http: //developer.android.com/reference/android/support/v4/widget/DrawerLayout.html
ActionBarDrawerToggle:http: //developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html
导入android.support.v4.widget.DrawerLayout无法解析导入android.support.v4.app.ActionBarDrawerToggle无法解析
我已将库更新到最新版本,但仍然无法识别这些类.
我正在开发一个应用程序,左侧有一个"抽屉"非常有用.我正在做一些初步测试,看看我最好能做到这一点,而且我遇到了一些非常基本的麻烦.
我的设置
1.我在Xcode 4中使用单视图应用程序模板
.2.在xib的"主/边界"视图中,我添加了2个UIViews(LeftPanel和RightPanel)和一个UIButton(ShowHideButton).
我为LeftPanel绿色和RightPanel蓝色着色,以便更容易看到.
4.加载视图时,两个面板都可见,UIButton的文本为"隐藏面板".
5.按下按钮后,LeftPanel应滑离屏幕(向左),RightPanel应展开以占据其原始空间加上LeftPanel腾出的空间.
6.此时,ShowHideButton应将其文本更改为"显示面板".
7.再次按下按钮后,LeftPanel应向后滑动到屏幕上(从左侧),RightPanel应缩小到"将其返回"原始空间.
8.此时,ShowHideButton应将其文本更改回"隐藏面板".
我正在使用实现动画animateWithDuration:animations:completion:.到目前为止,过渡关闭屏幕工作正常(非常好,其实).
令我不安的是,当我尝试将LeftPanel"带回"时,我得到了一个EXC_BAD_ACCESS.我已经在下面发布了我的代码,我已经看了它,但我真的看不到我正在访问的内容(或者是导致EXC_BAD_ACCESS的任何内容).
DrawerTestingViewController.h
#import <UIKit/UIKit.h>
typedef enum {
kHidden,
kShown
} PanelState;
@interface DrawerTestingViewController : UIViewController {
PanelState currentState;
UIButton *showHideButton;
UIView *leftPanel;
UIView *rightPanel;
}
@property (assign, nonatomic) PanelState CurrentState;
@property (strong, nonatomic) IBOutlet UIButton *ShowHideButton;
@property (strong, nonatomic) IBOutlet UIView *LeftPanel;
@property (strong, nonatomic) IBOutlet UIView *RightPanel;
- (IBAction)showHidePressed:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
DrawerTestingViewController.m
#import "DrawerTestingViewController.h"
@implementation DrawerTestingViewController
@synthesize CurrentState = currentState;
@synthesize LeftPanel = leftPanel; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的导航抽屉.我按照指南进行操作,并设法使用章节名称标题更改所选项目等等.现在我被卡住了,因为我不知道如何归档我接下来要做的事情.
当我在抽屉里点击一个项目- 家,例如-I希望它把我带到一个屏幕,我有我的具体画面的特定布局创建的所有东西.这是所有静态的东西,如TextViews图像,所以我不必对它们做任何事情.
我应该activity为ListView抽屉上的每个项目创建一个和一个布局,并且(不知道如何)开始活动onItemSelected()?或者我可以做一些事情,比如每次点击一个项目ListView并说出类似的东西时,动态创建一个片段
if(homeClicked){ //use home.xml as layout }
if(contactClicked){ //use contact.xml as layout }
Run Code Online (Sandbox Code Playgroud)
编辑
作为一个测试,我把onItemClick()一个方法传入了点击的数组位置.作为测试,我刚刚使用如下:
if(position==2) { // this is "contact" in the list layout
setContentView(R.layout.contacts);
}
Run Code Online (Sandbox Code Playgroud)
它确实有效,但显然我失去了抽屉,因为联系人布局的东西没有嵌套在DrawerLayout.是否有更优雅的方式来实现我的目标,而不是使用switchon位置和使用setContentView(),修改任何布局嵌套在DrawerLayout?(我甚至不知道它是否可能 - 可能不是,因为有相同的ID)
@Stefan对此进行了编辑,因为评论回复中没有足够的空间
谢谢Stefan,谷歌的例子让我更加困惑.我敢肯定,有一些关于片段的偷偷摸摸的东西,我可能已经阅读了10k次,但我的大脑拒绝同化.据我了解,在谷歌的例子,当你在抽屉里单击一个项目,它创建一个新片段,使该片段取代有除了抽屉里的唯一ListView的MainActivity的XML布局,这是一个FrameLayout是通吃屏幕的空间.然后所有片段都会显示一个行星,ImageView因此代码会根据ListView项目点击的数组位置对片段进行更改.
我正在为我正在开发的这个应用程序添加一个导航抽屉,我已经浏览了互联网; 论坛,stackoverflow,android开发者文档,仍然没有找到一个很好的答案.
我知道可以在不使用这些内容的情况下完成此操作.我想知道的是怎么样.NsMenuAdapter模型使用标题,然后有这些函数
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
Run Code Online (Sandbox Code Playgroud)
这显然正在寻找一个行动吧.我尝试了几个不起作用的模型,我刚刚尝试完成的大模型位于此处如何添加Android导航抽屉标题旁边的图标(这与我下面的链接有关,该项目来自gitHub这里https://github.com/gabrielemariotti/androiddev/tree/master/NavigationDrawer).现在关键的是,我正在使用自定义布局(即相对布局与线性布局混合在一起),我真的迷失了我的下一步应该是为了让它工作.
旁注:当我在main_activity.xml(导航抽屉的实现)中只有ListView时,它会像想象的那样正确滑出.但我不能为我的生活弄清楚如何用数据填充它.我基本上需要3个标题,其中包含可点击的导航元素,元素旁边有图标.
我通过相对布局http://gmariotti.blogspot.com/2013/05/creating-navigation-drawer.html转向了这个模型我的大部分见解如何做到这一点但是他们使用动作/标题栏这是什么真的把我扔了一圈.
navigation android drawer relativelayout android-support-library
我开始使用ActionBarSherlock使用NavigationDrawer并获得了很好的结果,但我的公司批准这个开源很可能不会很快到来,所以我正在努力切换到ActionBarCompat.
ActionBarCompat昨天(2013年7月24日)正式发布.有没有人让两个人都很好地相处?我希望我能回答我自己的问题,但看看是否有人让这个问题起作用.比赛开始了!:-)
YouTube上的ActionBarCompat发布: https ://www.youtube.com/watch?v = 6TGgYqfJnyc
更新(工作代码,是的!): 我已经从Google转换为使用ActionBarCompat的示例NavigationDrawer应用程序,它运行正常.您可以在此处找到它作为参考或开始您的项目:https: //github.com/bcrider/NavigationDrawerActionBarCompat
2.x版本看起来比使用ActionBarSherlock的方式更好,但是我必须更多地使用ActionBarCompat来看看我是否更喜欢它.
我试图在带有sherlock的操作栏中使用抽屉切换.这是我的主要活动:
import uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshAttacher;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
import com.mejorandroid.ejemplo3_clase3.fragments.MainFragment;
import com.mejorandroid.ejemplo3_clase3.fragments.TermsFragment;
public class MainActivity extends SherlockFragmentActivity
implements OnItemClickListener{
private ListView drawer_list;
private DrawerLayout drawer_layout;
private ActionBarDrawerToggle drawer_toggle;
private PullToRefreshAttacher pullToRefreshAttacher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pullToRefreshAttacher = PullToRefreshAttacher.get(this);
drawer_list = (ListView) findViewById(R.id.left_drawer);
drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
ArrayAdapter<String> drawer_adapter = new ArrayAdapter<String>(this,
R.layout.drawer_list_item, getResources().getStringArray(
R.array.array_drawer_options));
drawer_list.setAdapter(drawer_adapter); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个导航抽屉活动,以便我可以扩展该活动,并按照此问题中给出的答案链接所有活动中的菜单但是我的测试应用程序一直在崩溃,这是我的代码:
BaseActivity.java
public class BaseActivity extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
public String[] layers;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
// R.id.drawer_layout should be in every activity with exactly the same
// id.
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout,
R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.hello_world);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.hello_world);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.planets_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
drawerList.setAdapter(new …Run Code Online (Sandbox Code Playgroud) 我最近将我的项目更新到Android支持库23.1,我的代码的这部分现在给出了错误.
它在更新之前工作并且评论只是这部分允许我运行应用程序罚款.究竟是错误还是有变化?
Glide.with(getApplicationContext())
.load(R.drawable.banner)
.fitCenter()
.override(width, height / 2)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(back);
if (picture != null) {
Glide.with(getApplicationContext())
.load(picture)
.fitCenter()
.override(width / 2, height / 2)
.into(profile);
} else {
Glide.with(getApplicationContext())
.load(R.drawable.profile_p)
.fitCenter()
.override(width / 2, height / 2)
.into(profile);
}
Run Code Online (Sandbox Code Playgroud)
这是错误日志.
10-16 22:41:27.238 16313-16313/atsystems.cal E/AndroidRuntime: FATAL EXCEPTION: main
10-16 22:41:27.238 16313-16313/atsystems.cal E/AndroidRuntime: Process: atsystems.cal, PID: 16313
10-16 22:41:27.238 16313-16313/atsystems.cal E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{atsystems.cal/atsystems.cal.MainActivity}: java.lang.IllegalArgumentException: You must pass in a non null View
10-16 22:41:27.238 16313-16313/atsystems.cal E/AndroidRuntime: at …Run Code Online (Sandbox Code Playgroud)