❶ android的日誌Logger和Log比較,哪個好
建議使用Log,這是android專門用來開發列印日誌使用的。輸出的日誌可以在Logcat中查看。
Android開發中,所的有輸出都在logcat中 包含System.out輸出和printStackTrace()輸出都在Logcat中,Android開發,建議使用android提供的Log工具類來列印信息。
找到Logcat視圖的方式:
Eclipse 點擊 Window
Show View會出來一個對話框
點擊Ok按鈕時,會在控制台窗口出現LogCat視圖
android.util.Log常用的方法有以下5個:Log.v()Log.d()Log.i()Log.w()以及Log.e()。根據首字母對應VERBOSE,DEBUG,INFO,WARN,ERROR。
1、Log.v 的調試顏色為黑色的,任何消息都會輸出,這里的v代表verbose啰嗦的意思,平時使用就是Log.v("","");
2、Log.d的輸出顏色是藍色的,僅輸出debug調試的意思,但他會輸出上層的信息,過濾起來可以通過DDMS的Logcat標簽來選擇.
3、Log.i的輸出為綠色,一般提示性的消息information,它不會輸出Log.v和Log.d的信息,但會顯示i、w和e的信息
4、Log.w的意思為橙色,可以看作為warning警告,一般需要我們注意優化Android代碼,同時選擇它後還會輸出Log.e的信息。
5、Log.e為紅色,可以想到error錯誤,這里僅顯示紅色的錯誤信息,這些錯誤就需要認真的分析,查看棧的信息了。
❷ android textview 怎麼換行
textView如果想要強制換行的話,必須先把TextView顯示方式修改為多行(android:singleLine="false"),然後才能換行。
方法一般用兩種:
1、在字元串里加入「 」,如"abc rc";
2、把TextView設置為固定寬度,然後讓系統自動換行。如android:layout_width="100dp";
(2)androidlog換行擴展閱讀
Class Overview
向用戶顯示文本,並可選擇允許他們編輯文核襲本。TextView是一個完整的文改握兄本編輯器,但是基類為不允許編輯;其子類EditText允許文本編輯。
允許用戶復制部分或全部皮猜內容,將其粘貼到別的地方,設置XML屬性Android:textisselectable :「真」 或設置相關方法 settextisselectable 為「真」。textisselectable flag 允許用戶在TextView選擇手勢,從而觸發系統內置的復制/粘貼控制項。
Displays text to the user and optionally allows them to edit it. A TextView is a complete text editor, however the basic class is configured to not allow editing; seeEditTextfor a subclass that configures the text view for editing.
To allow users to some or all of the TextView's value and paste it somewhere else, set the XML attributeandroid:textIsSelectableto "true" or callsetTextIsSelectable(true). ThetextIsSelectableflag allows users to make selection gestures in the TextView, which in turn triggers the system's built-in /paste controls.
❸ android 中組件怎麼換行
應用中獲取會用到需要自動換行的控制項,而這並不是一般的線性或者相對布局就能實現的,在此分享下自定義控制項。原型是在網上找到的,在此稍作了修改。
這是設計出的樣稿,樣稿中的較高的圖片是從一個數據集中的穿插在另一個數據集中的,Textview的長度需要根據文字的長度不同而設置,而左右需要平分,做法如下:
1.將總體分為兩個數據集:左&右,並用2個LinearLayout分別裝自定義控制項
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="5dip">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</<span style="line-height: 21px;">PredicateLayout>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<<span style="line-height: 21px;">PredicateLayout android:id="@+id/righttab"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</<span style="line-height: 21px;">PredicateLayout>
2.自定義控制項
public class PredicateLayout extends LinearLayout {
int mLeft, mRight, mTop, mBottom;
Hashtable map = new Hashtable();
public PredicateLayout(Context context) {
super(context);
}
public PredicateLayout(Context context, int horizontalSpacing, int verticalSpacing) {
super(context);
}
public PredicateLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mWidth = MeasureSpec.getSize(widthMeasureSpec);
int mCount = getChildCount();
int mX = 0;
int mY = 0;
mLeft = 0;
mRight = 0;
mTop = 5;
mBottom = 0;
int j = 0;
View lastview = null;
for (int i = 0; i < mCount; i++) {
final View child = getChildAt(i);
child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
// 此處增加onlayout中的換行判斷,用於計算所需的高度
int childw = child.getMeasuredWidth();
int childh = child.getMeasuredHeight();
mX += childw; //將每次子控制項寬度進行統計疊加,如果大於設定的高度則需要換行,高度即Top坐標也需重新設置
Position position = new Position();
mLeft = getPosition(i - j, i);
mRight = mLeft + child.getMeasuredWidth();
if (mX >= mWidth) {
mX = childw;
mY += childh;
j = i;
mLeft = 0;
mRight = mLeft + child.getMeasuredWidth();
mTop = mY + 5;
//PS:如果發現高度還是有問題就得自己再細調了
}
mBottom = mTop + child.getMeasuredHeight();
mY = mTop; //每次的高度必須記錄 否則控制項會疊加到一起
position.left = mLeft;
position.top = mTop + 3;
position.right = mRight;
position.bottom = mBottom;
map.put(child, position);
}
setMeasuredDimension(mWidth, mBottom);
}
@Override
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(1, 1); // default of 1px spacing
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
Position pos = map.get(child);
if (pos != null) {
child.layout(pos.left, pos.top, pos.right, pos.bottom);
} else {
Log.i("MyLayout", "error");
}
}
}
private class Position {
int left, top, right, bottom;
}
public int getPosition(int IndexInRow, int childIndex) {
if (IndexInRow > 0) {
return getPosition(IndexInRow - 1, childIndex - 1)
+ getChildAt(childIndex - 1).getMeasuredWidth() + 8;
}
return getPaddingLeft();
}
}
3.將數據分別填充到左右兩個控制項中
這應該算是自動換行經典實例了吧,相信這個搞定以後同類型的需求都不成問題了。
❹ android調試輸出log列印信息到本地文件
在android開發中,Eclipse或者AndroidStudio調試時列印的信息很多,或者某些log字數超過Eclipse一行的字數限制,這個時候Eclipse就傻傻地把超出一行的log省略掉了,好喚侍給我們開發中帶來不方便。或者在進鏈陸行黑盒測試時,為了更加方便的找到錯誤信友吵息,我們可以把log信息使用命令行查看或者直接輸出到本地。
下面是命令的格式:
❺ Android 各種log 的介紹
包含設備日誌,堆棧跟蹤和其他診斷信息,可幫助您查找和修復應用中的錯誤。
安卓bugreport主要用於分析手機的狀態。其包含: main log , kernel log ,cpuinfo等信息。bugreport是一個可執行文件,編譯後的路徑為system/bin/bugreport,源碼位於framework/native/cmds/bugreport。其核心在於啟動mpsys服務。bugreport同mpstate服務建立socket通信(建立連接20次,超時3min無數據等容錯)。連接之後,將接收到的數據定向到文件中。
因此我們看到的bugreport數據均來自mpstate。
bugreport通過socket與mpstate服務建立通信,在mpstate.cpp中的mpstate()方法完成核心功能。分別輸出: current log、 last log、 vm trace、 mpsys、 system info
其詳細內容主要有: 系統build及運行時長等信息、 內存和CPU進程的信息、 kernel log、 system log、 radio log、 event log 等等。實際來說,bugreport中顯示的大部分為信息,都有對應的命令方式可以獲取。bugreport只是作為一個在不打擾用戶的前提下執行的一套命令集合。
1). main_log 記錄手機android上層app以及framework相關活動的log,比如你寫的app列印的log,就在這裡面
2). events_log 主要是ActivityManager、powerManager等相關的log
3). kernel Log 驅動相關的log
Logcat是內置在Android系統中的一個可執行工具,用於轉儲系統消息日誌,其中包括設備引發錯誤時的堆棧追蹤以及從您的應用當使用 Log 類編寫的消息。可以在主機上通過adb logcat命令來查看模擬機上日誌信息。
Android tcpmp是命令行數據包捕獲實用程序。它可以捕獲來自您的Wi-Fi連接,蜂窩連接以及您在android設備上可能具有的任何其他網路連接的數據包
modem 是手機里負責搜網和sim卡數據操作底層模塊,每個手機都有,md log 用於分析掉網、掉話、無信號等問題
系統崩潰時留下的遺言,怎麼死的,死哪了,死的多慘。
當一個動態庫(native 程序)開始執行時,系統會注冊一些連接到 debuggerd 的 signal handlers,當系統 crash(崩潰) 的時候,會保存一個 tombstone 文件到/data/tombstones目錄下(Logcat中也會有相應的信息),文件的確就像墓碑一樣記錄了死亡了的進程的基本信息(例如進程的進程號,線程號),死亡的地址(在哪個地址上發生了 Crash),死亡時的現場是什麼樣的(記錄了一系列的堆棧調用信息)等等。
6. netlog 網路相關
看網路鏈接情況,抓取網路包等等
7. QXDM(the Qualcomm eXtensible Diagnostic Monitor)高通可擴展診斷監視器
該工具適用於擁有使用Qualcomm ASIC和試用硬體的設備的人,並允許他們測試,評估和潛在診斷其移動設備的RF性能問題。通常使用它來促進這些設備的產品開發。
使用該軟體,用戶可以查看他們的移動設備發出的所有信令消息,因為該軟體會生成它們的日誌。這些日誌也可以通過軟體進行注釋。可以將網路和電話參數的任何混合添加到屏幕,並且允許用戶在使用其參數時使用復雜的公式。該程序還實時生成大量統計數據,以便用戶可以更好地識別潛在的性能問題。用戶可以訪問Markov統計信息,Mux統計信息,RLP統計信息,塊錯誤率,移動性管理數據,尋呼和訪問統計信息,前向和反向鏈路統計信息等等。該程序還為用戶提供了攜帶型設備信號的圖形顯示。該程序與Windows操作系統兼容。
8. init Log(init進程log)
9. Crashlog(崩潰日誌)
❻ android LinearLayout 裡面的東西怎麼換行
由於前段時間項目中使用到了自動換行的線性布局,本來打算用表格布局在裡面一個個的用java代碼添加ImageView的,但是添加的View控制項是不確定的,因為得靠伺服器的數據返回,就這樣手動用Java代碼畫布局扮粗的方式就這樣夭折了,因為在表哥布局中我無法確定一行顯示多少個ImageView的數目,所以無法動態添加,最後自能自己去看看那種能夠換行的線性布局了,線性布局比較不好的是不能自動換行,也就是當設置LinearLayout的orentation 設置為vertical 為豎直方向也就是只有一列,每行只能顯示一個View或者View的子類,當設置LinearLayout的orentitation為Horizontal,LinearLayout的只能顯示為一行,橫向顯示,當屏幕滿了的時候,View控制項並不會自動換行,所以我們要做的就是在LinearLayout滿的時候自動換行。x0dx0a需要了解的是怎搜缺桐么樣繪制根據子控制項的長寬繪制父控制項的寬度與高度,所以需要傳入的參數控制項的高度,視圖分為兩種一種是View類型的,代表控制項有TextView,Button,EditText 等等,還有一種是裝視圖的容器控制項繼承自ViewGroup的控制項,如LinearLayout,RelativeLayout,TabHost等等控制項,需要自動換行的線性布局的話,就需要根據子控制項的高度與寬度,來動態載入父控制項的高度與寬度,所以需世坦要在構造函數中傳入每一個子控制項的固定的高度,或者是動態設置子控制項的高度與寬度。x0dx0a將自定義的LinearLayout 也繼承自ViewGroup 並且重寫抽象類ViewGrouop的幾個方法:onMeasure(),onLayout(),dispathDraw() 三個方法的意思分別是:第一個onMeasure()是用來計算控制項以及子控制項所佔用的區域,第二個onLayout()是控制子控制項的換行,第三個可寫可不寫,主要是用來繪制控制項的邊框,x0dx0a自定義LinearLayout的代碼如下:x0dx0ax0dx0a[java] view plainprint?x0dx0apackage com.huanglong.mylinearlayout; x0dx0a x0dx0aimport android.content.Context; x0dx0aimport android.graphics.Canvas; x0dx0aimport android.graphics.Color; x0dx0aimport android.graphics.Paint; x0dx0aimport android.graphics.Rect; x0dx0aimport android.util.AttributeSet; x0dx0aimport android.view.View; x0dx0aimport android.view.ViewGroup; x0dx0a x0dx0a/** x0dx0a * @author huanglong 2013-5-28 自定義自動換行LinearLayout x0dx0a */ x0dx0apublic class FixGridLayout extends ViewGroup { x0dx0a private int mCellWidth; x0dx0a private int mCellHeight; x0dx0a x0dx0a public FixGridLayout(Context context) { x0dx0a super(context); x0dx0a } x0dx0a x0dx0a public FixGridLayout(Context context, AttributeSet attrs) { x0dx0a super(context, attrs); x0dx0a } x0dx0a x0dx0a public FixGridLayout(Context context, AttributeSet attrs, int defStyle) { x0dx0a super(context, attrs, defStyle); x0dx0a } x0dx0a x0dx0a public void setmCellWidth(int w) { x0dx0a mCellWidth = w; x0dx0a requestLayout(); x0dx0a } x0dx0a x0dx0a public void setmCellHeight(int h) { x0dx0a mCellHeight = h; x0dx0a requestLayout(); x0dx0a } x0dx0a x0dx0a /** x0dx0a * 控制子控制項的換行 x0dx0a */ x0dx0a @Override x0dx0a protected void onLayout(boolean changed, int l, int t, int r, int b) { x0dx0a int cellWidth = mCellWidth; x0dx0a int cellHeight = mCellHeight; x0dx0a int columns = (r - l) / cellWidth; x0dx0a if (columns < 0) { x0dx0a columns = 1; x0dx0a } x0dx0a int x = 0; x0dx0a int y = 0; x0dx0a int i = 0; x0dx0a int count = getChildCount(); x0dx0a for (int j = 0; j < count; j++) { x0dx0a final View childView = getChildAt(j); x0dx0a // 獲取子控制項Child的寬高 x0dx0a int w = childView.getMeasuredWidth(); x0dx0a int h = childView.getMeasuredHeight(); x0dx0a // 計運算元控制項的頂點坐標 x0dx0a int left = x + ((cellWidth - w) / 2); x0dx0a int top = y + ((cellHeight - h) / 2); x0dx0a // int left = x; x0dx0a // int top = y; x0dx0a // 布局子控制項 x0dx0a childView.layout(left, top, left + w, top + h); x0dx0a x0dx0a if (i >= (columns - 1)) { x0dx0a i = 0; x0dx0a x = 0; x0dx0a y += cellHeight; x0dx0a } else { x0dx0a i++; x0dx0a x += cellWidth; x0dx0a x0dx0a } x0dx0a } x0dx0a } x0dx0a x0dx0a /** x0dx0a * 計算控制項及子控制項所佔區域 x0dx0a */ x0dx0a @Override x0dx0a protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { x0dx0a // 創建測量參數 x0dx0a int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST); x0dx0a int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST); x0dx0a // 記錄ViewGroup中Child的總個數 x0dx0a int count = getChildCount(); x0dx0a // 設置子空間Child的寬高 x0dx0a for (int i = 0; i < count; i++) { x0dx0a View childView = getChildAt(i); x0dx0a /* x0dx0a * 090 This is called to find out how big a view should be. 091 The x0dx0a * parent supplies constraint information in the width and height x0dx0a * parameters. 092 The actual mesurement work of a view is performed x0dx0a * in onMeasure(int, int), 093 called by this method. 094 Therefore, x0dx0a * only onMeasure(int, int) can and must be overriden by subclasses. x0dx0a * 095 x0dx0a */ x0dx0a childView.measure(cellWidthSpec, cellHeightSpec); x0dx0a } x0dx0a // 設置容器控制項所佔區域大小 x0dx0a // 注意setMeasuredDimension和resolveSize的用法 x0dx0a setMeasuredDimension(resolveSize(mCellWidth * count, widthMeasureSpec), x0dx0a resolveSize(mCellHeight * count, heightMeasureSpec)); x0dx0a // setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); x0dx0a x0dx0a // 不需要調用父類的方法 x0dx0a // super.onMeasure(widthMeasureSpec, heightMeasureSpec); x0dx0a } x0dx0a x0dx0a /** x0dx0a * 為控制項添加邊框 x0dx0a */ x0dx0a @Override x0dx0a protected void dispatchDraw(Canvas canvas) { x0dx0a // 獲取布局控制項寬高 x0dx0a int width = getWidth(); x0dx0a int height = getHeight(); x0dx0a // 創建畫筆 x0dx0a Paint mPaint = new Paint(); x0dx0a // 設置畫筆的各個屬性 x0dx0a mPaint.setColor(Color.BLUE); x0dx0a mPaint.setStyle(Paint.Style.STROKE); x0dx0a mPaint.setStrokeWidth(10); x0dx0a mPaint.setAntiAlias(true); x0dx0a // 創建矩形框 x0dx0a Rect mRect = new Rect(0, 0, width, height); x0dx0a // 繪制邊框 x0dx0a canvas.drawRect(mRect, mPaint); x0dx0a // 最後必須調用父類的方法 x0dx0a super.dispatchDraw(canvas); x0dx0a } x0dx0a x0dx0a} x0dx0a然後在Xml文件中引用自己定義的控制項,在Java代碼中調用:x0dx0ax0dx0a[java] view plainprint?x0dx0apackage com.huanglong.mylinearlayout; x0dx0a x0dx0aimport android.os.Bundle; x0dx0aimport android.app.Activity; x0dx0aimport android.view.Menu; x0dx0aimport android.view.MenuItem; x0dx0aimport android.widget.CheckBox; x0dx0aimport android.widget.SimpleAdapter; x0dx0aimport android.support.v4.app.NavUtils; x0dx0a x0dx0apublic class MainActivity extends Activity { x0dx0a private SimpleAdapter adapter; x0dx0a @Override x0dx0a public void onCreate(Bundle savedInstanceState) { x0dx0a super.onCreate(savedInstanceState); x0dx0a setContentView(R.layout.activity_main); x0dx0a FixGridLayout fixGridLayout = (FixGridLayout) findViewById(R.id.ll); x0dx0a fixGridLayout.setmCellHeight(30); x0dx0a fixGridLayout.setmCellWidth(100); x0dx0a for (int i = 0; i < 7; i++) { x0dx0a CheckBox box = new CheckBox(MainActivity.this); x0dx0a box.setText("第"+i+"個"); x0dx0a fixGridLayout.addView(box); x0dx0a } x0dx0a } x0dx0a x0dx0a @Override x0dx0a public boolean onCreateOptionsMenu(Menu menu) { x0dx0a getMenuInflater().inflate(R.menu.activity_main, menu); x0dx0a return true; x0dx0a } x0dx0ax0dx0a}