我开始使用DialogFragment,因为他们通过方向更改和其他东西很好地工作.但是我遇到了令人讨厌的问题.
我有AsyncTask显示进度DialogFragment并解散它onPostExecute.一切正常,除非在onPostExecute应用程序处于后台时发生(例如,在按下Home按钮后).然后我在DialogFragment解雇时得到了这个错误 - " Can not perform this action after onSaveInstanceState".卫生署.常规对话框工作得很好.但不是FragmentDialog.
所以我想知道,在应用程序处于后台时,解雇DialogFragment的正确方法是什么?我没有真正使用Fragments,所以我认为我只是遗漏了一些东西.
android android-fragments android-dialog android-dialogfragment
我注册了一个监听网络事件的接收器:
<receiver
android:label="NetworkConnection"
android:name=".ConnectionChangeReceiver" >
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
接收器也很简单:
public class ConnectionChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null) {
Log.v("@@@","Receiver : " + activeNetInfo);
} else {
Log.v("@@@","Receiver : " + "No network");
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当连接Wifi时,我连续收到3条相同的消息,如下所示:
Receiver : NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true
Receiver : NetworkInfo: type: …Run Code Online (Sandbox Code Playgroud) 我虽然这将是一个简单的任务,但显然没有办法将listview滚动到底部.我发现的所有解决方案都使用setSelection(lastItem)方法的变体,它只将选择设置为最后一项,但不会滚动到它的底部.
在我的情况下,我有一个空的列表视图(有一个长的空视图标题集),我想滚动到它的底部.
那么,有没有办法做到这一点?
编辑:
所以对于那些感兴趣的人来说,工作解决方案是:
getListView().setSelectionFromTop(0, -mHeader.getHeight());
Run Code Online (Sandbox Code Playgroud)
和
getListView().scrollTo(mOffset)
Run Code Online (Sandbox Code Playgroud)
这也有效,右偏移(根据当前滚动位置计算),但可能会给你一些意想不到的结果.
可以说我有一个这样的列表:
<ul style="list-style-type: upper-latin;">
<li>Lorem</li>
<li>Ipsum</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
(list-style-type可能是任何东西 - 上罗马,片假名,低希腊)
list-style-type: upper-latin;将在每个列表项的前面放一个字母(从A开始).有没有办法获得任何给定列表项的这封信?我可以使用jQuery .index()或类似的方法迭代列表.
或者,也许有办法从风格中提取标记?
这里的答案仅适用于拉丁字母列表.
我有一个位置的给定用户的聊天室列表,以及另一个位置的给定聊天室的消息总数.我想跟踪聊天室用户所属的一些消息.
我有以下片段:
//getting all chat rooms this user belongs to
mFirebase.child("myChatRooms").child("testUser").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded (DataSnapshot dataSnapshot, String previousKey){
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class);
//listening to message count in every chat room user belongs to
mFirebase.child("chatRoomMessageCount").child(postSnapshot.getKey()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//number of messages have changed
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}
//......
}
Run Code Online (Sandbox Code Playgroud)
问题是,如何在调用onChildRemoved时删除所有这些ValueEventListener,或者我将不再需要它们?
处理这种情况的建议方法是什么?我应该在HashMap中存储子键和侦听器并自己跟踪它们还是有一些方法可以删除给定firebase位置的所有侦听器?
也许这是一个愚蠢的问题,但我无法找到一种方法来在TextView的第二行末尾插入小图像.图像始终显示在整个文本视图的右侧,而不是行结束.
我想插入这样的图像:
TextTextTextTextTextTextTextTextTextText
TextTextTextText. <ImageView>
Run Code Online (Sandbox Code Playgroud)
我得到的是:
TextTextTextTextTextTextTextTextTextText <ImageView>
TextTextTextText.
Run Code Online (Sandbox Code Playgroud)
我希望有办法做到这一点.
源:
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TESTESTESTESTESTESTESTESTESTESTESTESTES"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#FFFFFF" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv"
android:src="@drawable/icon" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud) 我有WebView加载一些页面,当它完成时我应用一些javascript魔法来搞乱DOM.一切都很好,页面加载,onPageFinished我只是打电话wv.loadUrl(javascript);
但我不想看到加载过程,以及javascript如何工作,我只需要结果,所以我wv.setVisibility(View.INVISIBLE);从一开始就使我的视图不可见,并在完成所有操作后再次显示它.这就是问题发生的地方.
这段代码应该在javascript完成后使视图可见,但wv.setVisibility(View.VISIBLE)在javascript之前触发.所以有一会儿我看到了页面以及如何通过javascript更改它.这只是丑陋的.
public void onPageFinished (WebView view, String url) {
wv.loadUrl(javascript);
view.getSettings().setLoadsImagesAutomatically(true);
wv.setVisibility(View.VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)
我得到了loadUrl的异步工作,所以我尝试用另外的"make first view visible"方法制作另一个WebViewClient onPageFinished,并用它来调用JS.但它只是随着NPE错误而崩溃.
wv2.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished (WebView view, String url) {
wv.setVisibility(View.VISIBLE);
}
});
Run Code Online (Sandbox Code Playgroud)
现在我只是在javascript(SystemClock.sleep(5000))之后添加延迟,但这就像..是的.
我有画廊小部件,当你滚动它时,当前选择的图像有边框 - 只是简单的选择器,像这样
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
android:drawable="@drawable/thumbnail_frame" />
<item
android:drawable="@android:color/transparent" />
Run Code Online (Sandbox Code Playgroud)
并在画廊适配器的getView中附加这样的
image.setBackgroundDrawable(getResources().getDrawable(R.drawable.xxx));
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用setSelection()更改图库选择时,所选项目没有边框.但是,当我只是用手指边框滚动选定的项目工作正常.我认为,setSelection()不会触发setSelected()或类似的东西.
我想,解决方案是调用setSelected()和setSelection(),但是如何为当前选择的ImageView调用它?或者还有其他方法吗?
我正在尝试从数据库中填充ListView,并使用花哨的删除按钮调整每一行.所以我创建了列表Activity和自定义SimpleCursorAdapter.
这是主要的ListView活动:
public class EditEntries extends ListActivity {
Cursor cursor;
DBAdapter db = new DBAdapter(this);
private static String[] FROM = { _ID, SCORE_COLUMN,
"date(time, 'localtime')", };
private static int[] TO = { R.id.rowid, R.id.title, R.id.time, };
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.entries_list);
try {
cursor = getEvents();
showEvents(cursor);
} finally {
db.close();
}
}
private void showEvents(Cursor cursor) {
// Set up data binding
SMSimpleCursorAdapter adapter = new SMSimpleCursorAdapter(this,
R.layout.entries_list_item, cursor, FROM, TO);
setListAdapter(adapter);
}
private Cursor getEvents() { …Run Code Online (Sandbox Code Playgroud) 我有一个想要在双击时平滑放大的ImageView.
目前我有像这样的变焦工作
public boolean onDoubleTap(MotionEvent e) {
ImageView imageView = (ImageView) findViewById(imageViewId);
int width = imageView.getWidth();
int height = imageView.getWidth();
float maxScale;
if ( width < height ) {
maxScale = (float) (width * Math.pow(1.5, 6));
} else {
maxScale = (float) (height * Math.pow(1.5, 6));
}
Drawable d = imageView.getDrawable();
int imageWidth = d.getIntrinsicWidth();
int imageHeight = d.getIntrinsicHeight();
float[] value = new float[9];
matrix.getValues(value);
scaleWidth = (int)(imageWidth * value[Matrix.MSCALE_X]);
scaleHeight = (int)(imageHeight * value[Matrix.MSCALE_Y]);
if ( (scaleWidth * 2) …Run Code Online (Sandbox Code Playgroud) 我有一个耗时的任务(迭代文件并将其内容发送到服务器)我想在后台线程中执行,在特定的interwal中(这就是我想使用Handler的原因).
从UI线程我有这样的调用:
LogsManager lm;
lm = new LogsManager(this);
lm.processLogFiles();
Run Code Online (Sandbox Code Playgroud)
在LogsManager课堂上我有以下代码:
public void processLogFiles(){
Handler mHandler = new Handler();
mHandler.postDelayed(logsRunable, 1000);
}
private Runnable logsRunable = new Runnable() {
@Override
public void run() {
File f = new File(Environment.getExternalStorageDirectory()+Constants.LOG_DIR);
File[] logFiles = f.listFiles();
for (int i = 0; i < logFiles.length; i++) {
readLogs(logFiles[i]); // executes some other methods inside
}
}
};
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,这只是Handler调用方法Runnable.不幸的是,它也阻止了我的UI线程.是不是Handler应该开始一个新线程Runnable?我也在我的应用程序的其他部分使用处理程序,它们工作得很好.我做错了吗?