城堡中的美女(2)–主界面
主界面布局:
一个抽屉样式, 中间内容的是一个FragmentLayout 和左侧的listview的
的图片的类别:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" > <!-- 抽屉样式的内容 -->
<FrameLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout> <!-- 抽屉的左侧抽屉 -->
<ListView
android:id="@+id/mian_left_drawer_lv"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#c2cb"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" >
</ListView>
</android.support.v4.widget.DrawerLayout>
左侧listview的数据源在res/values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>气质</item>
<item>校花</item>
<item>时尚</item>
<item>素颜 </item>
<item>唯美</item>
<item>清纯</item>
<item>可爱</item>
<item>长发</item>
<item>小清新</item>
<item>嫩萝莉</item>
<item>网络美女</item>
<item>设置</item>
</string-array>
<string-array name="planets_array2">
<item>全部</item>
<item>风景</item>
<item>创意</item>
<item>名车</item>
<item>影视 </item>
<item>游戏</item>
<item>动漫</item>
<item>气质</item>
<item>可爱</item>
<item>素颜</item>
<item>明星</item>
<item>设置</item>
</string-array>
<string-array name="hights">
<item>240</item>
<item>600</item>
<item>768</item>
</string-array>
</resources>
通过getResources().getStringArray(int ):
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
添加一个万能适配器
private SparseArray mViews;
用来存储listviewitem布局文件的控件的容器 是一个Map形式,
比Map效率高, SpareArray
put(int, view);
第一次由于直接将容器最终化,大致listView布局显示内容出现问题
主界面
ActionBarDrawerToggle的使用
遇到到的问题, 一开是这是actionBar出现异常, 发现NullPointerException
原来是写了下面的无标题, 而忘了actionBar ,导致getActionBar() =null
//requestWindowFeature(Window.FEATURE_NO_TITLE);
使用ActionBarDrawerToggle来监视Drawlayout的打开和关闭
package com.chb.beautifalGrils.app.activity;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.SearchManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.chb.beautifalGrils.R;
import com.chb.beautifalGrils.app.adapter.Bean;
import com.chb.beautifalGrils.app.adapter.CommonAdapter;
import com.chb.beautifalGrils.app.adapter.LeftBean;
import com.chb.beautifalGrils.app.adapter.MagicViewHolder;
/**
* 主界面
* @author chb
*/
public class MainActivity extends Activity {
/**
* ActionBarDrawerToggle 是 DrawerLayout.DrawerListener实现。
和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。
作用:
1.改变android.R.id.home返回图标。
2.Drawer拉出、隐藏,带有android.R.id.home动画效果。
3.监听Drawer拉出、隐藏;
*/
private ActionBarDrawerToggle mDrawerToggle;
/**
*这个抽屉布局
*/
private DrawerLayout mDrawerLayout;
/**
*左侧的listView
*/
private ListView mDrawerListView;
private List<Bean> LeftDatas;
/**
* 左侧的listview数据
*/
private String[] mPlanetTitles;
private CommonAdapter<Bean> commonAdapter = null;
/**
*抽屉关闭时的标题
*/
protected CharSequence mTitle;
/**
* 抽屉打开时的标题
*/
protected CharSequence mDrawerTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
/* AppConnect.getInstance(this).setCrashReport(true);
AseoZdpAseo.init(this, AseoZdpAseo.INSERT_TYPE);*/
initData();
initView();
if(savedInstanceState == null){
selectItem(0);
}
}
/**
* 视图的初始化
*/
private void initView() {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerListView = (ListView) findViewById(R.id.mian_left_drawer_lv);
//mDrawerListView.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, mPlanetTitles));
mDrawerListView.setAdapter(commonAdapter);
//当抽屉打开, 将内容区域用阴影覆盖, 使用一个.9图片
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
/**
* 设置listview点击事件
*/
mDrawerListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> paramAdapterView,
View paramView, int position, long paramLong) {
selectItem(position);
}
});
try {
///使应用程序图标表现为ActionBar动作切换导航抽屉
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
} catch (Exception e) {
e.printStackTrace();
}
/**
* 内部实现抽屉状态监听
* onDrawerOpen
* onDrawerClose
*/
mDrawerToggle = new ActionBarDrawerToggle(
MainActivity.this,
mDrawerLayout,
R.drawable.ic_drawer,
R.string.drawer_open,
R.string.drawer_close){
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
};
//设置抽屉状态监听事件
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
/**
* listview点击position位置
* @param position
*/
protected void selectItem(int position) {
if (position == 11) {
Intent mIntent = new Intent(MainActivity.this, SettingActivity.class);
startActivity(mIntent);
} else {
/**
* update the main content by replacing fragments
* 替换内容区域的fragment
*/
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.main_content, fragment).commit();
// update selected item and title, then close the drawer
mDrawerListView.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerListView);
}
}
/**
* 初始化数据
*/
private void initData() {
//顶部的显示表听
mTitle = mDrawerTitle = (String) getTitle();
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
LeftDatas = new ArrayList<Bean>();
for (int i = 0; i < mPlanetTitles.length; i++) {
LeftBean leftBean = new LeftBean(mPlanetTitles[i]);
LeftDatas.add(leftBean);
}
//初始化左侧listview适配器的数据
commonAdapter = new CommonAdapter<Bean>(LeftDatas, R.layout.main_left_listview_item, MainActivity.this) {
@Override
protected void doView(MagicViewHolder magicViewHolder) {
LeftBean leftBean = (LeftBean)LeftDatas.get(magicViewHolder.getPosition());
Toast.makeText(MainActivity.this, "--->"+leftBean+"position:"+magicViewHolder.getPosition(), 1).show();
((TextView)magicViewHolder.getView(R.id.main_left_listview_item_tv1)).setText(leftBean.getText());
}
};
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
case R.id.action_websearch:
// create intent to perform web search for this planet
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, getActionBar().getTitle());
// catch event that there's no activity to handle intent
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(this, R.string.app_not_available,
Toast.LENGTH_LONG).show();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}