您的位置:首页 > 产品设计 > UI/UE

扣丁学堂笔记第07天高级UI组件(三)

2016-03-24 20:17 281 查看
1.PopupWindow











MainActivity

package com.example.popupwindowtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void showClick(View view) {
View v = getLayoutInflater().inflate(R.layout.popupwindow_layout, null);
PopupWindow mPopupWindow = new PopupWindow(v,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
//		mPopupWindow.getBackground().setAlpha(100); 这句会报空指针异常,表示不解
mPopupWindow.setBackgroundDrawable(getResources().getDrawable(
android.R.drawable.alert_dark_frame));
mPopupWindow.setAnimationStyle(R.style.AppTheme);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setTouchable(true);
mPopupWindow.setFocusable(true);
mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

mPopupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
}
}


popupwindow_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<Button
android:id="@+id/edit_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="编辑" />

<Button
android:id="@+id/delete_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除" />

</LinearLayout>


2.Notifications_普通通知















MainActivity

package com.example.notificationtest;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

private static final int NID_1 = 0x1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void sendClick(View v) {
Notification.Builder builder = new Notification.Builder(this);

// 通知属性
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("你有一条新消息");
builder.setContentText("生日快乐!");

// 创建一个通知
Notification n = builder.build();

// 创建一个通知管理器,发送通知
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NID_1, n);
}

}






现在的通知还不能点击,需定义一个pendingIntent,当点击通知时跳转到一个界面(Activity),然后发送意图



使用eclipse的话,别忘了在清单文件注册MainActivity2.java,否则点击通知无反应

MainActivity

package com.example.notificationtest;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

public static final int N_ID = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void sendClick1(View v){
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("你有一条新消息");
builder.setContentText("爱安卓,爱生活!");
builder.setTicker("新消息");

Intent intent = new Intent(this,MainActivity2.class);
intent.putExtra("msg", "你是猴子请来的逗比吗?");
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pi);

Notification n = builder.build();

NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(N_ID,n);
}
}


MainActivity2

package com.example.notificationtest;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity2 extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView = (TextView) findViewById(R.id.tv);
String msg = getIntent().getStringExtra("msg");
textView.setText(msg);
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(MainActivity.N_ID);
}
}


3.Notifications_大视图通知

通过调用Notification的InboxStyle()的方法得到一个Notification.InboxStyle对象的实例style,再调用style的setBigContentTitle()、addLine()等方法,再调用builder的setStyle方法吧style实例传进去。



MainActivity

public void sendClick2(View v){
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("你有大视图新消息");
//    	sbuilder.setContentText("爱安卓,爱生活!");
builder.setTicker("新消息");

Notification.InboxStyle style = new Notification.InboxStyle();
style.setBigContentTitle("吟诗作对");
style.addLine("长亭外");
style.addLine("古道边");
style.addLine("一行白鹭上青天");

builder.setStyle(style);

Notification n = builder.build();

NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(N_ID2, n);
}


4.Notifications_进度条通知



通过线程的方式来模拟更新

MainActivity

public void sendClick3(View v){
final Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("更新中");
builder.setContentText("正在由装逼模式更新至牛逼模式……");
builder.setProgress(100, 5, false);

final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(N_ID3,builder.build());

new Thread(new Runnable() {
public void run() {
for(int progress=0;progress<=100;progress+=5){
builder.setProgress(100, progress, false);
nm.notify(N_ID3, builder.build());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
builder.setContentText("由于机主逼格不够,更新失败,返回逗逼模式");
nm.notify(N_ID3, builder.build());
}
}).start();
}


5.Notifications_自定义视图通知





custom_layout.xml预览图



MainActivity

public void sendClick4(View v){
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setTicker("音乐播放器");

RemoteViews views = new RemoteViews(getPackageName(), R.layout.custom_layout);
views.setTextViewText(R.id.button_play, "暂停");
views.setTextViewText(R.id.textView_song, "名为你的那个人");
builder.setContent(views);

NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(N_ID4, builder.build());

}


6.样式和主题_Style

如果需要重复使用相同属性的组件,一个一个配置显得效率太低,可以使用自定义样式来解决属性的重复配置,style的xml位于values目录下

style.xml

<style name="TextViewStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">35sp</item>
<item name="android:background">#ff0000</item>
</style>

<style name="TextViewStyle.Button">
<item name="android:alpha">100</item>
</style>


activity_main.xml

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="35sp"
android:background="#ff0000"
android:text="@string/hello_world" />
<TextView
style="@style/TextViewStyle"
android:text="@string/hello_world"/>

<Button
style="@style/TextViewStyle.Button"/>


7.样式和主题_Theme



8.自定义组件_实现步骤



9.自定义组件_ScrollView嵌套ListView、GridView的冲突

ScrollView中只能包含一个组件,所以需要一个LinearLayout容纳里面需要的组件

在ScrollView中添加一个足够item的ListView和足够的Button,模拟器显示ListView的item就会有丢失,为了解决冲突,需要新建一个MyListView继承自ListView,重写构造方法,还要添加onMeasure()方法

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string-array name="name">
<item>安卓1</item>
<item>安卓2</item>
<item>安卓3</item>
<item>安卓4</item>
<item>安卓5</item>
<item>安卓6</item>
<item>安卓7</item>
<item>安卓8</item>
<item>安卓9</item>
<item>安卓10</item>
</string-array>
</resources>


activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.scrollviewlistviewtest.MainActivity" >

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

<com.example.scrollviewlistviewtest.MyListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:entries="@array/name">
</com.example.scrollviewlistviewtest.MyListView>

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</ScrollView>

</LinearLayout>


MyListView.java

package com.example.scrollviewlistviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

public class MyListView extends ListView {

public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}

public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: