2016-04-28 39 views
13

我正在使用自定義ProgressBar。現在,當一項任務正在進行時,我正在顯示進度條,但用戶仍然可以與視圖和控件進行交互。 如何在整個視圖中禁用用戶交互,就像ProgressDialog所做的那樣,當它可見時。如何在android中顯示ProgressBar時禁用用戶交互?

我是否需要在主視圖頂部使用透明視圖,並在該視圖上顯示進度條,並在任務完成後隱藏該視圖。

或者只是得到我的父視圖的id,並將其設置爲禁用?但是,我無法調暗背景,就像view/Activity/Fragment上出現對話框時發生的情況一樣。對?

我只想知道在進度條可見時不允許用戶進行任何交互的方式。

謝謝

+0

可能的複製(HTTP://計算器。 com/questions/2819778/custom-drawable-for-progressbar-progressdialog) –

+2

@txteclipse我不想自定義進度條,我已經這樣做了。 所以,我的問題是不重複的。 我只想禁用用戶交互,而進度條是可見的,同樣的方式,當ProgressDialog可見時,用戶不能與其他UI控件交互而不關閉進度對話框。 現在我的問題是如何重複的問題。我的問題甚至與定製關係不大。 –

+0

如果你想要一個對話框的所有功能,你應該使用一個對話框。例如,模態不是微不足道的:接受的答案不會阻止鍵盤交互。鏈接問題中的第二個答案演示瞭如何在ProgressDialog中使用自定義ProgressBar資源。如果這不能滿足您的需求,您可以使用ProgressBar使用[自定義佈局](http://developer.android.com/guide/topics/ui/dialogs.html#CustomLayout)。 –

回答

38

你的問題:如何禁用用戶交互,而進度採用的是Android可見?

要禁用,你只需要添加以下代碼

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

得到用戶的互動活動,你只需要添加以下代碼

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

這裏的用戶交互是一個例子: 注:我只是給你一個例子▼如何禁用或保留用戶交互

在xml.Something這樣

<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/progressBar" 
    android:visibility="gone"/> 

添加一個進度條,在MainActivity當按下按鈕你顯示進度和禁用用戶交互。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mImageView = (ImageView) findViewById(R.id.imageView); 
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
    mImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mProgressBar.setVisibility(View.VISIBLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
     } 
    }); 
} 

當用戶backPressed刪除。如果您要添加的禁用功能,並灰色顯示進度又保留用戶interaction.Something這樣

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    mProgressBar.setVisibility(View.GONE); 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
} 

,你需要添加你的xml佈局文件是一個填充父項的線性佈局。將其背景設置爲#B0000000,並將其可見性設置爲「已完成」。比編程式將其可見性設置爲可見。

希望得到這個幫助!

-1

你可以像這樣使用ProgressDialog;

ProgressDialog progressBar = new ProgressDialog(MainActivity.this); 
progressBar.setMessage("YourMessageHere"); 
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progressBar.setCancelable(false); 
progressBar.show(); 
+0

我已經知道了。但我的問題只適用於ProgressBar。我不想使用ProgressDialog。我用我自己的動畫使用自定義ProgressBar。 –

+2

ProgressDialog已棄用 – Raskayu

+0

@Raskayu,那是因爲我在2016年4月28日發佈了它,我不認爲它已被棄用,然後 –

0

使用文檔默認方法progressbar.setCancelable(假)

+0

但是它會對用戶交互產生什麼影響?當ProgressBar可見並且可取消設置爲false時,我仍然可以觸摸或鍵入EditText。 –

+0

,並從一個進度條開始有setCancelable(false)屬性? –

+0

當您的任務運行可setenabled爲您的父視圖和任務完成setenabled設置爲true後,你有選項 – R2R

0

只是設置:

在XML
android:clickable="true" 

<ProgressBar... 

只有這使得魔術!

1

我已通過向ProgressBar添加根佈局來解決此問題。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:clickable="true" 
    android:gravity="center" 
    android:visibility="gone" 
    android:id="@+id/progress"> 
    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:indeterminate="true" 
     android:indeterminateTintMode="src_atop" 
     android:indeterminateTint="@color/primary"/> 
</LinearLayout> 

作出的根佈局點擊

android:clickable="true" 

注:在我的主要看法,我不得不RelativeLayout爲根,並在最後一個位置上述代碼添加了根佈局內(最後兒童)。

希望這有助於!

0

用透明背景進行對話。 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);的問題是,當應用程序將在後臺進行並返回時,用戶將能夠與UI組件交互,進行更多的處理。因此,阻止用戶界面做一個透明的對話框,如果你想設置時間隱藏/顯示。在可運行線程中執行此操作。因此,該解決方案將是

public class TransparentDialogHelper { 

    private Dialog overlayDialog; 

    @Inject 
    public TransparentDialogHelper() { 

    } 

    public void showDialog(Context context) { 
     if (AcmaUtility.isContextFinishing(context)) { 
      return; 
     } 
     if (overlayDialog == null) { 
      overlayDialog = new Dialog(context, android.R.style.Theme_Panel); 
      overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED); 
     } 
     overlayDialog.show(); 
    } 

    public void hideDialog() { 
     if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) { 
      return; 
     } 
     overlayDialog.cancel(); 
    } 
} 

-------- Timer 

Handler handler = new Handler(); 
handler.postDelayed(() -> { 
    view.hideProgress(); 
}, 2000); 
0

讓你的父母佈局相對佈局&補充一點:

<RelativeLayout ... > 

    <other layout elements over which prog bar will appear> 

<RelativeLayout android:id="@+id/rl_progress_bar" 
       android:layout_width="match_parent" android:clickable="true" 
       android:layout_height="match_parent" > 
<ProgressBar android:id="@+id/pb" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:indeterminateOnly="true" 
      style="@android:style/Widget.DeviceDefault.ProgressBar" 
      android:theme="@style/AppTheme.MyProgressBar" 
    /> 
</RelativeLayout> 

如果你已經浮在你的用戶界面的按鈕,他們仍然抓住所有的焦點&保持點擊時進度條是可見的。這種用途:(當你的PROG欄可見&重新啓用它們時,你讓你的前衛酒吧無形/消失)的[自定義繪製對象的進度/ ProgressDialog]

fb.setEnabled(false); 
相關問題