2016-08-04 18 views
0

我正在使用處理程序來更改某些UI屬性,但在應用程序運行時我看不到任何更改。爲什麼不編譯代碼?我在我的線程中使用處理程序來更改UI按鈕和圖像。我瞭解圖像我可以很容易地使用位圖更高效,但即時通訊使用此線程學習編碼與線程,以提高應用程序的性能。使用線程來改變片段中的UI屬性?

片段代碼;

import android.media.Image; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.ViewGroup; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.ImageView; 
import android.widget.TextView; 
import org.w3c.dom.Text; 
import android.view.View; 
import android.os.AsyncTask; 
import java.net.URL; 
import android.os.Handler; 
import android.os.Message; 


public class headercode extends Fragment { 

    ImageView image; 
    TextView text; 
    View myView; 
    Thread thread; 

    Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) 
     { 
      image = (ImageView)myView.findViewById(R.id.image); 
      image.setBackgroundResource(R.drawable.ahmed); 
     } 
    }; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     myView = inflater.inflate(R.layout.frag, container, false); 
     text = (TextView)myView.findViewById(R.id.text); 
     Runnable r = new Runnable() 
     { 
      @Override 
      public void run(){ 
       handler.sendEmptyMessage(0); 
      } 
     }; 
     return myView; 
    } 
} 

主要活動代碼當然我調用OnCreate(),並顯示使用Activity創建的初始片段;

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.FragmentManager; 
import android.widget.FrameLayout; 
import android.widget.Button; 



public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 




    Button button; 
    headercode header; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 



     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 



     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     if (findViewById(R.id.fragment) != null){ 

      header = new headercode(); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragment,header).commit(); 
     } 

    } 

回答

0
Runnable r = new Runnable() 
{ 
    @Override 
    public void run(){ 
     handler.sendEmptyMessage(0); 
    } 
}; 

在這裏你只要定義一個Runnable,但你沒有張貼到處理程序。所以你應該了Runnable認定中之後添加一行:

handler.post(r); 

而且,事實上,你做你的代碼許多錯誤:

,如果你使用了Runnable,你並不需要ovrride handleMessage,他們是做同樣的工作,所以你只需要使用Runnable或只使用handleMessage,像以下:其實

// Just use Runnable 
@Override 
public View onCreateView(...) { 
    //... 
    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 
      image = (ImageView)myView.findViewById(R.id.image); 
      image.setBackgroundResource(R.drawable.ahmed); 
     } 
    }) 
    //... 
} 


//------------------------------------------------- 
// Or just use handleMessage 
Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     image = (ImageView)myView.findViewById(R.id.image); 
     image.setBackgroundResource(R.drawable.ahmed); 
    } 
}; 

@Override 
public View onCreateView(...) { 
    //... 
    handler.sendEmptyMessage(0); 
    //... 
} 

而且,在這裏,你沒有使用任何的子線程,所有所調用都在主線程。使用Runnable或Handler並不意味着在子線程中運行。